目录
1 Redis介绍与安装
# redis:缓存数据库 [大部分时间做缓存,不仅仅可以做缓存],非关系型数据库[区别于mysql关系型数据库]
-nosql: 非关系型数据库
-C语言写的 服务(监听端口),用来存储数据的,数据是存储在内存中,取值,放值速度非常快, 10w qps
# 面试题:redis为什么这么快
-1 纯内存操作
-2 网络模型使用的IO多路复用(epo11)(可以处理的请求数更对多)
-3 6.x之前,单进程,单线程架构,没有线程进程间切换,更少的消耗资源
# key-value形式存储,没有表的概念
# 版本:
最新: 7.x
公司里: 5.x比较多
# 安装
-mac 源码编译安装
-linux 源码编译安装
-win 微软自己 基于源码改动,编译成安装包
# 最新5.x版本
https://github.com/tporadowski/redis/releases/
# 最新3.x版本
https://github.com/microsoftarchive/redis/releases
一路下一步,安装完成释放出两个命令,会把redis自动加入到服务中
redis-server # mysqld 服务端的启动命令
redis-cli # mysql 客户端的启动命令
# 安装目录
redis-server
redis-cli
redis.windows-service.conf 配置文件
-blind 127.0.0.1 # 服务,跑在的地址
-port 6379 # 监听的端口
# 启动redis
1 方式一:
-在服务中,点击启动,后台启动
2 方式二: 使用命令
redis-server 指定配置文件 如果不指定,会默认
# 客户端连接redis
1 方式一
redis-cli # 默认连接本地的6379端口
2 方式二:
redis-cli -h 地址 -p 端口
3 使用图形化客户端操作
-Redis Desktop Manager : 开源的,原来免费,后来收费 推荐用(mac, win,linxu 都有)
-Qt5 qt是一个平台,专门用来做图形化界面的
-可以使用 C++写
-可以使用Python写 pyqt5 使用python写图形化界面(少量公司再用)
-resp-2022.1.0.0.exe 一路下一步,安装完启动起来
-Redis Client 小众
图形化界面,连接redis 输入地址和端口 点击连接即可
# redis默认有16个库,默认连进去就是第0个
2 Redis普通连接和连接池
# python 相当于客户端,操作redis
# 安装模块: pip install redis
# 补充: django 中操作mysql,没有连接池的 一个请求就是一个mysql连接
-可能会有问题,并发数过高,导致mysql连接数过高,影响Mysql性能
-使用django连接池:
https://blog.51cto.com/liangdongchang/5140039
2.2 连接池连接
###pool.py
import redis
POOL = redis.ConnectionPool(max_connections=10,host='127.0.0.1',port=6379) # 创建一个大小为10的redis连接池
### 测试代码
import redis
from threading import Thread
from pool import POOL
def task():
# 做成模块后,导入,无论导入多少次,导入的都算那一个POOL对象
conn = redis.Redis(connection_pool=POOL) # 报错的原因是拿连接,池里不够了 没有等待,线程报错 设置等待,参数
print(conn.get('name'))
for i in range(1000):
t = Thread(target=task) # 每次都是一个新的连接,会导致 连接数过多
t.start()
2.3 单例模式:设计模式
导入的6种方式(具体使用会重新开博客总结)
# 1. 模块导入
其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。
# 2. 使用装饰器
# 3. 使用类
# 4. 基于__new__方法实现
# 5. 基于metaclass方法实现
3 Redis之字符串类型
# redis 是key-value形式存储
# redis 数据存放在内存中,如果断电,数据丢失--->需要有持久化的方案
# 5中数据类型 ,value类型
-字符串: 用的最多,做缓存:做计数器
-列表: 简单的消息队列
-字典(hash): 缓存
-集合: 去重
-有序集合: 排行榜
字符串类型使用
'''
1 set(name, value, ex=None, px=None, nx=False, xx=False)
2 setnx(name, value)
3 setex(name, value, time)
4 psetex(name, time_ms, value)
5 mset(*args, **kwargs)
6 get(name)
7 mget(keys, *args)
8 getset(name, value)
9 getrange(key, start, end)
10 setrange(name, offset, value)
11 setbit(name, offset, value)
12 getbit(name, offset)
13 bitcount(key, start=None, end=None)
14 bitop(operation, dest, *keys)
15 strlen(name)
16 incr(self, name, amount=1)
# incrby
17 incrbyfloat(self, name, amount=1.0)
18 decr(self, name, amount=1)
19 append(key, value)
'''
import redis
conn = redis.Redis()
1 set(name, value, ex=None, px=None, nx=False, xx=False)
# ex:过期时间(秒)
# px:过期时间(毫秒)
# nx, 如果设置为True,则只有name不存在。当前set操作才执行,值存在,就修改不了,执行没效果
# xx, 如果设置为True,则只有name存在的时候,当前set操作才执行,值存在才能修改,值不存在 不会设置新值
conn.set('hobby','篮球', ex=6)
# 创建k值 hobby v:篮球 6秒之后过期
conn.set('hobby','篮球', px=6)
# 创建k值 hobby v:篮球 6毫秒之后过期
conn.set('name','wei',nx=True)
# 执行没有效果 因为值存在
conn.set('name','lqz',nx=False)
# 更改成功 value值变成 lqz
conn.set('hobby','篮球',xx=True) # 执行没效果
conn.set('hobby','篮球',xx=False) # 有效果
# xx,如果设置为True,则只有name存在时,当前set操作才执行,值存在才能修改,值不存在,不会设置新值
# redis---》实现分布式锁,底层基于nx实现的
2 setnx(name, value)
# 等同于:conn.set('name','lqz',nx=True)
conn.setnx('name', '刘亦菲') #有值不会修改
3 setex(name, value, time)
# 等同于:conn.set('name','lqz',ex=3)
conn.setex('wife', 3, '刘亦菲')
# 源码:setex(self, name: KeyT, time: ExpiryT, value: EncodableT) 过期时间放在中间
4 psetex(name, time_ms, value)
conn.psetex('wife',3000,'刘亦菲') # 毫秒
5 mset(*agrs, **kwargs)
conn.mset({'wife':'刘亦菲','hobby':'篮球','job':'码农'}) # 一次性可以创建多个
6 get(name)
print(str(conn.get('wife'),encoding='utf-8'))
print(conn.get('wife')) # b'\xe5\x88\x98\xe4\xba\xa6\xe8\x8f\xb2'
7 mget(keys, *args) # 多次取值
res=conn.mget('wife','hobby')
res=conn.mget(['wife','hobby'])
8 getset(name, value) # 取name对应的值 然后修改放入
res=conn.getset('wife','迪丽热巴')
print(res) # 刘亦菲
9 getrange(key, start, end)
res = str(conn.getrange('wife', 0, 2), encoding='utf-8') # 字节长度 不是字符长度,前闭后闭区间
print(res)
10 setrange(name, offset, value)
conn.setrange('wife',2,'bbb') # 把 wife的值第二个字节修改成bbb wwweeeiii ----> wwbbbeiii
# ---- 比特位---操作 后面讲
11 setbit(name, offset, value)
12 getbit(name, offset)
13 bitcount(key, start=None, end=None)
# ---- 比特位---操作
14 bitop(operation, dest, *keys) 获取多个值,并将值做位运算,将最后的结果保存至新的name对应的值
15 strlen(name)
res = conn.strlen('hobby') # 统计字节长度 篮球 6
print(res)
16 incr(self, name, amount=1)
# 自增, 不会出并发安全问题,单线程架构,并发量高
conn.incr('age')
# # incrby
17 incrbyfloat(self, name, amount=1.0)
# conn.incrbyfloat('age',1.2) 可以小数自增 但是精度有小问题
18 derc(self, name, amount=1)
conn.decrby('age')
conn.decrby('age',-1) # 负负得正 自增1
19 append(key, value)
conn.append('hobby','sb')
print(conn.strlen('hobby'))
conn.close()
'''
你需要记住的
set
get
strlen 字节长度
incr
'''
标签:01,name,基础,redis,value,set,Redis,conn
From: https://www.cnblogs.com/wei0919/p/17189737.html