什么是redis?
redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
redis实际上是在内存中建立一块缓存区,可以进行不同数据之间的数据传递。【不同进程之间的内存是不能共享的】QQ与微信要想进行数据的传输,需要在内存中构建一个中间商,用于二者之间的连接。相当于在中间商在二者之间建立了socket。
redis的安装
https://github.com/MicrosoftArchive/redis/releases
安装后,在安装路径下使用redis-cli.exe可以进行命令行式的操作。【命令行的操作指令与在python中使用的格式略有不同】
在使用命令行式的操作时,当对于一个指令的编写格式不熟悉时,可以使用help指令进行查询:
String类型操作
该类型的操作只是针对字符串,数字类型的存储,即只是键值对形式的单值存储。从返回的结果中可以看出,这样直接set再get的结果返回的是byte类型。对于整型可以直接使用int将其强转。
其中,第三行是连接池操作,使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。
redis中提供了Redis和****StrictRedis两个类,推荐使用StrictRedis类(第5行)。生成的实例可以添加到连接池当中。
然后,通过set指令,将数据传输到内存的缓存中。
可以在使用get指令,获取数据。
1 # r.set() 目前只能设置数字和字符串类型
2 import redis
3 pool_redis = redis.ConnectionPool(host="localhost", port=6379)
4 r = redis.Redis(connection_pool=pool_redis) # 将当前的redis实例与连接池pool_redis链接
5 # r = redis.StrictRedis(host='localhost', port=6379, password=123456)
6 r.set('data', 10) # 这里面不能传列表、字典 等等只能传入数字和字符串
7 print(r.get('data'))
8 a = r.get('data')
9 print(int(a))
输出:
1 b'10'
2 10
包含的方法:
set系列
1 set(name, value, ex=None, px=None, nx=False, xx=False)
在Redis中设置值,默认:不存在则创建,存在则修改
参数:
#ex,过期时间(秒)
#px,过期时间(毫秒)
#nx,如果设置为True,则只有name不存在时,当前set操作才执行
#xx,如果设置为True,则只有name存在时,当前set操作才执行
还有一些对set中包含的ex/px/nx/xx进行展开的方法
1 setnx(name, value) # set中nx字段的展开方法
设置值,只有name不存在时,执行设置操作(添加)
1 setex(name, value, time) # set中ex字段的展开方法
# 设置值
# 参数:
# time,过期时间(数字秒 或 timedelta对象)
1 psetex(name, time_ms, value) # set中px字段的展开方法
# 设置值
# 参数:
# time_ms,过期时间(数字毫秒 或 timedelta对象)
1 mset(*args, **kwargs) # 批量设置值
批量设置值
#如:
mset(k1='v1', k2='v2')
#或
mset({'k1': 'v1', 'k2': 'v2'})
1 setrange(name, offset, value) # 从某个位置开始替换
修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
# 参数:
# offset,字符串的索引,字节(一个汉字三个字节)
# value,要设置的值
get系列
1 get(name)
获取值
1 mget(keys, *args)
批量获取
#如:
mget('data', 'data_info')
#或
r.mget(['data', 'data_info'])
1 getset(name, value) # ***
在设置新值时获取原来的值
1 getrange(key, start, end) # 获取时进行切片的操作
获取子序列(根据字节获取,非字符)
# 参数:
# name,Redis 的 name
# start,起始位置(字节)
# end,结束位置(字节)