Python39 Redis
Redis介绍
不同程序之间可以通过json来读取和存储持久化数据;
mongoDB很早就有了,也可以持久化数据,可以将数据即存在内存,又存在硬盘;
redis相当于半持久化,默认redis将数据存储在数据库,需要主动去调度才能存到硬盘;
redis每秒可以读取或写入能达到8-10万左右的数据读取速度
Centos安装Redis
yum -y install redis
运行redis
[root@root day11]# redis-cli Could not connect to Redis at 127.0.0.1:6379: Connection refused # 安装完后直接运行会报错,拒绝 [root@root day11]# nano /etc/redis.conf # 编辑redis.conf,将其中的daemonize no 改为 daemonize yes,保存。 [root@root day11]# redis-server /etc/redis.conf [root@root day11]# redis-cli 127.0.0.1:6379>
在Redis中通过字典的数据形式来存储数据。也就是说用key和value的方式存储数据。
[root@bogon ~]# redis-cli 127.0.0.1:6379> set name ZhangSan OK 127.0.0.1:6379> set age 22 OK 127.0.0.1:6379> keys * 1) "name" 2) "age" 127.0.0.1:6379> 127.0.0.1:6379> get name "ZhangSan" 127.0.0.1:6379> get age "22" 27.0.0.1:6379> set name LiSi OK 127.0.0.1:6379> get name "LiSi" 127.0.0.1:6379> 127.0.0.1:6379> set name LiSi ex 2 OK 127.0.0.1:6379> get name (nil) 127.0.0.1:6379>
说明:
line2:设置name为key,ZhangSan为value
line4:设置age为key,设置22位value
line6:查看所有key
line11:查询name这个key的value
line16:覆盖name的value为LiSi
line21:设置key和value; ex 表示存活2秒钟
line23:可以看到超过2秒钟去查看时,已经没有数据了
import redis r = redis.Redis(host='127.0.0.1',port=6379) r.set('foo','Bar') print(r.get('foo'))
执行结果:
b'Bar'
- 连接池
redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数redis,这样就可以实现多个redis实例共享一个连接池。
只要使用redis,与redis的交互可能就会很频繁,可以使用连接池来减少开销。
import redis pool = redis.ConnectionPool(host='127.0.0.1',port=6379) r = redis.Redis(connection_pool=pool) r.set('foo','Bar') print(r.get('foo'))
执行结果:
b'Bar'
Redis String操作
String就是key与value的操作。
ex:之前测试了是只生效X秒,X过后就过期。
px:作用于ex一样,不过px是毫秒。
nx:如果设置key和value时,如果该key不存在时才会执行操作。
xx:只有key存在时,执行操作才会成功(与nx相反)。
SETNX:相当于nx等于True
SETEX:相当于ex
PSETEX:相当于px
mset:批量设置
mget:批量获取key的value
getset:设置新值并获取原来的值
- nx
127.0.0.1:6379[2]> set name LiSi OK 127.0.0.1:6379[2]> set name ZS nx (nil) 127.0.0.1:6379[2]> get name "LiSi"
line3:重新设置name这个key后可以看到显示为(nil)没生效。
line5:查看name这个key,value依然是line1设置的LiSi
- xx
127.0.0.1:6379[2]> set name Amy xx OK 127.0.0.1:6379[2]> get name "Amy" 127.0.0.1:6379[2]> set name2 TT xx (nil) 127.0.0.1:6379[2]>
line3:可以看到后面加xx参数,且执行成功了,说明key之前是已经存在的。
line5:name2这个key之前不存在,执行未成功。
- SETEX
# 查看SETEX的语法 127.0.0.1:6379[2]> help SETEX SETEX key seconds value summary: Set the value and expiration of a key since: 2.0.0 group: string 127.0.0.1:6379[2]> SETEX name3 5 lisi # 设置过期时间为5秒 OK 127.0.0.1:6379[2]> get name3 "lisi" 127.0.0.1:6379[2]> get name3 # 过了5秒get就没有了 (nil) 127.0.0.1:6379[2]>
- mset批量设置
127.0.0.1:6379[2]> help mset MSET key value [key value ...] summary: Set multiple keys to multiple values since: 1.0.1 group: string 127.0.0.1:6379[2]> mset n1 11 n2 22 n3 33 #批量设置key和value OK 127.0.0.1:6379[2]> keys * # 查看批量创建的key 1) "n1" 2) "n2" 3) "n3" 127.0.0.1:6379[2]> mget n1 n2 n3 # 批量get key的value 1) "11" 2) "22" 3) "33" 127.0.0.1:6379[2]>
- getset
127.0.0.1:6379[2]> getset n1 LiSi #设置新值并获取原来的值 "11" 127.0.0.1:6379[2]> get n1 "LiSi" 127.0.0.1:6379[2]>
- getrange:
getrange可以对字符串切片
127.0.0.1:6379[2]> getrange n1 0 2 "LiS" 127.0.0.1:6379[2]>
- setrange
setrange可以多片设置参数
127.0.0.1:6379[2]> setrange n1 0 * #将n1的第0个下标参数开始设置参数为* (integer) 4 127.0.0.1:6379[2]> get n1 "*iSi" # 从第1个下标开始设置参数为12;因为1和2是两个参数,所以相当于将下标1设置成1,下标2设置成2。 127.0.0.1:6379[2]> setrange n1 1 12 (integer) 4 127.0.0.1:6379[2]> get n1 "*12i"
- setbit
通过二进制来设置value值
27.0.0.1:6379[2]> set n3 lisi # 设置一个值为lisi OK 127.0.0.1:6379[2]> get n3 "lisi"
打开pycharm的python console或进入python中
ord('l') # 通过ord将lisi的第一个字母l换算成十进制 108 bin(108) # 在通过bin函数将数字换算成二进制 '0b1101100' # 0b1101100是二进制,ob后面应该是8个数字'0b01101100',但是因为ob后面第1个数字是0,所以这里给省略了。我们将这二进制中的1进行计算,结果就是108。
下面回到redis-cli中
# 我们将n3的第6下标(python从0开始算,实际相当于二进制的第7个值)设置为1,相当于将二进制从右数第2个(正数第7个)值设置为1,该值为1的话表示十进制为2. l字母+2位,就是n字母。 127.0.0.1:6379[2]> setbit n3 6 1 (integer) 0 127.0.0.1:6379[2]> get n3 "nisi" 127.0.0.1:6379[2]>
bitcount
127.0.0.1:6379[2]> set n3 a OK 127.0.0.1:6379[2]> get n3 "a" # 获取到的数字是3;a对应的十进制是97,97对应的二进制是01100001;二进制中有3个1,所以bitcount统计的是二进制中有几个1。 127.0.0.1:6379[2]> bitcount n3 (integer) 3 127.0.0.1:6379[2]> # 一个字节有8个bits,但是这里setbit时,设置的是第11下标的bit为1,相当于往后延伸。 127.0.0.1:6379[2]> setbit n3 11 1 (integer) 1 127.0.0.1:6379[2]> get n3 "a0" # 结果为"a0"
setbit应用场景举例
现在很多人都在用微博,某个最流行的微博用户达到上亿,如果我们想统计同时在线用户的数量和哪些用户在线时,我们可以将这些数据存储到数据库,但是数据库的数据达到500万以上时再进行查询,速率会比较慢,且存储的空间也会较大,就别更说上亿用户的存储量了。
这里我们可以通过setbit方式进行设置。
# 每个用户都有对应的用户id,这里我们将n5 后面的数字指定为成用户的id,然后将其设置为1,就表示在线。 使用bitcount可以统计其在线用户的数量,同时也可以查看在线对应的用户id来查找哪些用户在线。 127.0.0.1:6379[2]> setbit n5 1000 1 (integer) 0 127.0.0.1:6379[2]> setbit n5 666 1 (integer) 0 127.0.0.1:6379[2]> setbit n5 5000 1 (integer) 0 # 通过getbit来查询,显示为1表示在线,显示为0为不在线。 127.0.0.1:6379[2]> getbit n5 1000 (integer) 1 127.0.0.1:6379[2]> getbit n5 666 (integer) 1 127.0.0.1:6379[2]> getbit n5 5000 (integer) 1 127.0.0.1:6379[2]> getbit n5 888 (integer) 0 127.0.0.1:6379[2]> getbit n5 9989 (integer) 0
1B=8bits
1K=1024B
1M=1024K
1M=8388608bits
也就是说我们1M的数据就可以存储800多万的用户数据,这不单单节省了大量的存储空间,而且查询数据也将快很多。
- incr 和decr
数字的递增和递减,可以用来进行数据统计
127.0.0.1:6379[2]> incr a (integer) 1 127.0.0.1:6379[2]> incr a (integer) 2 127.0.0.1:6379[2]> incr a (integer) 3 127.0.0.1:6379[2]> incr a (integer) 4 127.0.0.1:6379[2]> decr a (integer) 3 127.0.0.1:6379[2]> decr a (integer) 2 127.0.0.1:6379[2]> decr a (integer) 1 127.0.0.1:6379[2]> decr a (integer) 0 127.0.0.1:6379[2]> decr a (integer) -1 127.0.0.1:6379[2]> decr a (integer) -2 127.0.0.1:6379[2]> decr a (integer) -3 127.0.0.1:6379[2]>
- append
添加内容到指定key
127.0.0.1:6379[2]> get name "Amy" 127.0.0.1:6379[2]> append name test (integer) 7 127.0.0.1:6379[2]> get name "Amytest" 127.0.0.1:6379[2]>
Redis hash操作
之前使用set的数据都是单一的,想要查看set的数据只能一个一个的去get;
这里我们通过hset来设置整体相关联的数据,类似"{key:{key:value}}
127.0.0.1:6379> hset info name lisi (integer) 1 127.0.0.1:6379> hset info age 22 (integer) 1 127.0.0.1:6379> hset info id 1234 (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> hgetall info #查看所有info中的内容 1) "name" 2) "lisi" 3) "age" 4) "22" 5) "id" 6) "1234" 127.0.0.1:6379> 127.0.0.1:6379> hkeys info #查看所有keys 1) "name" 2) "age" 3) "id" 127.0.0.1:6379> 127.0.0.1:6379> hget info name #查看info中指定的内容 "lisi" 127.0.0.1:6379> hget info age "22" 127.0.0.1:6379> hget info id "1234" 127.0.0.1:6379>
- hmset
批量设置hset
127.0.0.1:6379> hmset info2 k1 1 k2 2 OK 127.0.0.1:6379> hgetall info2 1) "k1" 2) "1" 3) "k2" 4) "2" 127.0.0.1:6379> 127.0.0.1:6379> hmget info2 k1 k2 # 批量mget 1) "1" 2) "2" 127.0.0.1:6379>
- hlen
查看长度
127.0.0.1:6379> hlen info2 (integer) 2 127.0.0.1:6379>
- hvals
查看所有value
127.0.0.1:6379> hvals info2 1) "1" 2) "2" 127.0.0.1:6379>
- hexists
判断是否存在
127.0.0.1:6379> hexists info2 k1 # k1存在,显示结果为1 (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> hexists info2 k3 # k2不存在,显示结果为0 (integer) 0 127.0.0.1:6379>
- hdel
删除key
- hincrby
递增指定的数字
127.0.0.1:6379> 127.0.0.1:6379> hexists info2 k3 (integer) 0 127.0.0.1:6379> HINCRBY info2 k2 1 (integer) 3 127.0.0.1:6379> HINCRBY info2 k2 1 (integer) 4 127.0.0.1:6379> HINCRBY info2 k2 2 (integer) 6 127.0.0.1:6379> HINCRBY info2 k2 2 (integer) 8 127.0.0.1:6379> hget info2 k2 "8" 127.0.0.1:6379>
- hincrybyfloat
与hincrby效果一样
- hscan
过滤
# 过滤info2,从下标0开始过滤,匹配k*的数据 127.0.0.1:6379> hscan info2 0 match k* 1) "0" 2) 1) "k1" 2) "1" 3) "k2" 4) "8" 127.0.0.1:6379> 127.0.0.1:6379> hscan info2 0 match *1 1) "0" 2) 1) "k1" 2) "1" 127.0.0.1:6379>
- hscan_iter
使用hscan,返回一个迭代器回来。
#如: for item in r.hscan_iter('xx'): print(item)
hscan_iter(name, match=None, count=None) # 利用yield封装hscan创建生成器,实现分批去redis中获取数据 # 参数: # match,匹配指定key,默认None 表示所有的key # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数 # 如: # for item in r.hscan_iter('xx'): # print item
Redis列表
- lpush
# 通过lpush生成一个列表。 l表示逐个的将每个值向左放 127.0.0.1:6379> lpush names ZhangSan Lisi WangEr (integer) 3 # lrange查看names这个列表,从下标0到下标-1。 # 因为lpush,所以第一个是ZhangSan,第二个LiSi要放在ZhangSan的左边,WangEr放在LiSi的左边,所以最后查看列表的值是以下情况。 127.0.0.1:6379> lrange names 0 -1 1) "WangEr" 2) "Lisi" 3) "ZhangSan" 127.0.0.1:6379>
- rpush
# rpush向右逐个放值 127.0.0.1:6379> rpush names Amy Bob (integer) 5 127.0.0.1:6379> lrange names 0 -1 1) "WangEr" 2) "Lisi" 3) "ZhangSan" 4) "Amy" 5) "Bob" 127.0.0.1:6379>
- lpushx
只有当列表存在的时候,才会将值放入列表中
- llen
查看列表长度
- linsert
# 将值插入到指定值的前面或后面 127.0.0.1:6379> linsert names before Lisi test1 (integer) 6 127.0.0.1:6379> linsert names after Lisi test2 (integer) 7 127.0.0.1:6379> lrange names 0 -1 1) "WangEr" 2) "test1" 3) "Lisi" 4) "test2" 5) "ZhangSan" 6) "Amy" 7) "Bob" 127.0.0.1:6379>
- lset
# 修改值的内容 127.0.0.1:6379> lset names 1 123 OK 127.0.0.1:6379> lrange names 0 -1 1) "WangEr" 2) "123" 3) "Lisi" 4) "test2" 5) "ZhangSan" 6) "Amy" 7) "Bob" 127.0.0.1:6379>
- lrem
# 从指定key中,从左开始删除指定的value,下面的1相当于值删除一个Lisi 127.0.0.1:6379> lrem names 1 Lisi (integer) 1 127.0.0.1:6379> lrange names 0 -1 1) "WangEr" 2) "123" 3) "test2" 4) "ZhangSan" 5) "Amy" 6) "Bob" 127.0.0.1:6379>
# 插入3个Bob 127.0.0.1:6379> linsert names after 123 Bob (integer) 7 127.0.0.1:6379> linsert names after test2 Bob 127.0.0.1:6379> lrange names 0 -1 1) "WangEr" 2) "123" 3) "Bob" 4) "test2" 5) "Bob" 6) "ZhangSan" 7) "Amy" 8) "Bob" 127.0.0.1:6379> # 从左删除2个Bob 127.0.0.1:6379> lrem names 2 Bob (integer) 2 127.0.0.1:6379> lrange names 0 -1 1) "WangEr" 2) "123" 3) "test2" 4) "ZhangSan" 5) "Amy" 6) "Bob" 127.0.0.1:6379>
- lpop
# 从左删除value,并返回删除的value 127.0.0.1:6379> lpop names "WangEr" 127.0.0.1:6379> lpop names "123" 127.0.0.1:6379> lrange names 0 -1 1) "test2" 2) "ZhangSan" 3) "Amy" 4) "Bob" 127.0.0.1:6379>
- ltrim
# 保留指定下标的value,删除其他value 127.0.0.1:6379> ltrim names 1 2 OK 127.0.0.1:6379> lrange names 0 -1 1) "ZhangSan" 2) "Amy" 127.0.0.1:6379>
- rpoplpush
# rpush Lisi这个value到names2这个key 127.0.0.1:6379> rpush names2 Lisi (integer) 1 # names进行rpop,并将rpop的值 lpush到names2中 127.0.0.1:6379> rpoplpush names names2 "Amy" 127.0.0.1:6379> lrange names 0 -1 1) "ZhangSan" 127.0.0.1:6379> lrange names2 0 -1 1) "Amy" 2) "Lisi" 127.0.0.1:6379>
- brpoplpush
# 利用brpoplpush 测试生产者消费者模型 # 启用两个redis-cli #在第一个redis-cli # 我们将names的值清空,移到names2中去 127.0.0.1:6379> rpoplpush names names2 "ZhangSan" 127.0.0.1:6379> 127.0.0.1:6379> lrange names 0 -1 (empty list or set) 127.0.0.1:6379> 127.0.0.1:6379> lrange names2 0 -1 1) "ZhangSan" 2) "Amy" 3) "Lisi" 127.0.0.1:6379>
# 在第1个redis-cli中 # 使用brpoplpush names names2 60 如果当前names为空,就会等待60秒 127.0.0.1:6379> brpoplpush names names2 60 # 在第2个redis-cli中 # push value到names中,此时60秒还没有到,就将test123这个value push到了names中 127.0.0.1:6379> lpush names test123 (integer) 1 127.0.0.1:6379> # 在第1个redis-cli中 # (error) ERR wrong number of arguments for 'rpoplpush' command 127.0.0.1:6379> brpoplpush names names2 60 "test123" (11.62s) # 第11.62秒的时候,names被push进了test123这个value,所以会停止等待 # 在查看names2,可以看到已经将test123 从names push到names2中了 127.0.0.1:6379> lrange names2 0 -1 1) "test123" 2) "ZhangSan" 3) "Amy" 4) "Lisi" 127.0.0.1:6379>
集合
无序集合
# 我们在集合中插入重复的value 127.0.0.1:6379> sadd names3 amy amy 11 11 jack jack (integer) 3 # 提示只插入了3个值,因为另外3个是重复的,集合给去重了 # 通过smembers查看集合 127.0.0.1:6379> smembers names3 1) "jack" 2) "amy" 3) "11" 127.0.0.1:6379>
- scard
获取 key中value的个数
- sdiff
比较集合差集
# 新建一个names4集合, 其中定义的amy这个value在names3中也有 127.0.0.1:6379> sadd names4 amy LiSi LiLei (integer) 3 # 比较names3与names4的差集,就是在names3中有的,且在names4中没有的值。 127.0.0.1:6379> sdiff names3 names4 1) "jack" 2) "11" 127.0.0.1:6379>
- sdiffstore
# 将names3与names4的差集结果存储到Test集合中 127.0.0.1:6379> SDIFFSTORE Test names3 names4 (integer) 2 # 查看Test集合中的value 127.0.0.1:6379> smembers Test 1) "jack" 2) "11" 127.0.0.1:6379>
- sinter
# 查看names3与names4的交集 127.0.0.1:6379> sinter names3 names4 1) "amy" 127.0.0.1:6379>
- sinterstore
获取交集的内容,并存储到一个新的key中,与sdiffstore使用方式一样
- sismember
# 查看amy这个值在 names3这个集合中是否存在 127.0.0.1:6379> sismember names3 amy (integer) 1 # 存在返回1 127.0.0.1:6379> 127.0.0.1:6379> sismember names3 ZhangSan (integer) 0 # 不存在返回0 127.0.0.1:6379>
- smove
将一个值从一个集合 move 到另一个集合中
127.0.0.1:6379> smembers names3 1) "jack" 2) "amy" 3) "11" 127.0.0.1:6379> smembers names4 1) "LiLei" 2) "amy" 3) "LiSi" 127.0.0.1:6379> smove names3 names4 11 (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> smembers names3 1) "jack" 2) "amy" 127.0.0.1:6379> 127.0.0.1:6379> smembers names4 1) "LiLei" 2) "amy" 3) "11" 4) "LiSi" 127.0.0.1:6379>
- spop
# 移除尾部数据 127.0.0.1:6379> spop names4 "11" 127.0.0.1:6379> smembers names4 1) "LiLei" 2) "amy" 3) "LiSi" 127.0.0.1:6379>
- srandmember
# 随机获取集合中的衣蛾值 127.0.0.1:6379> srandmember names4 "LiLei" 127.0.0.1:6379> srandmember names4 "amy" 127.0.0.1:6379> srandmember names4 "LiSi" 127.0.0.1:6379> srandmember names4 "LiSi" 127.0.0.1:6379> srandmember names4 "LiSi" 127.0.0.1:6379>
- srem
# 删除指定的值 127.0.0.1:6379> srem names3 amy (integer) 1 127.0.0.1:6379> smembers names3 1) "jack" 127.0.0.1:6379>
- sunion
# 获取并集 127.0.0.1:6379> sunion names3 names4 1) "amy" 2) "LiLei" 3) "jack" 4) "LiSi" 127.0.0.1:6379>
- sunionstore
# 获取并集并存入到新的集合中 127.0.0.1:6379> SUNIONSTORE Test2 names3 names4 (integer) 4 127.0.0.1:6379> smembers Test2 1) "amy" 2) "LiLei" 3) "jack" 4) "LiSi" 127.0.0.1:6379>
- sscan
# 从下标0开始过滤 j开头的值 127.0.0.1:6379> sscan Test2 0 match j* 1) "0" 2) 1) "jack" 127.0.0.1:6379>
- scan_iter
scan迭代器
有序集合
- zadd
# 将value设置权重(分数)并加入到集合z1中,权重越小越靠前 127.0.0.1:6379> zadd z1 10 alex 5 jack 8 rain 4 amy (integer) 4 127.0.0.1:6379> zrange z1 0 -1 1) "amy" 2) "jack" 3) "rain" 4) "alex" 127.0.0.1:6379> # 在设置加入一个权重为7的alex值 127.0.0.1:6379> zadd z1 7 alex (integer) 0 # 可以看到因为集合没有重复的alex,但是alex的权重(分数)变了,所以在集合中的位置也就变了 127.0.0.1:6379> zrange z1 0 -1 1) "amy" 2) "jack" 3) "alex" 4) "rain" 127.0.0.1:6379>
# 通过withscores可以查看value和其对应的分数(权重) # 这个可以用于班级学生对应考试分数的例子 127.0.0.1:6379> zrange z1 0 -1 withscores 1) "amy" 2) "4" 3) "jack" 4) "5" 5) "alex" 6) "7" 7) "rain" 8) "8" 127.0.0.1:6379>
- zcard
获取集合value数量
- zcount
# 获取z1 分数 6到8之间的value有几个 127.0.0.1:6379> zcount z1 6 8 (integer) 2 127.0.0.1:6379>
- zincrby
递增
- zrank
127.0.0.1:6379> zrange z1 0 -1 withscores 1) "amy" 2) "4" 3) "jack" 4) "5" 5) "alex" 6) "7" 7) "rain" 8) "8" 127.0.0.1:6379> # zrank用于查看某个value的分数排名,这里alex分数第二高,所以返回值为2 127.0.0.1:6379> zrank z1 alex (integer) 2 127.0.0.1:6379>
- zrem
删除集合中的value
- zremrangebyrank
# 根据下标1到2的位置,进行范围删除 127.0.0.1:6379> ZREMRANGEBYRANK z1 1 2 (integer) 2 127.0.0.1:6379> zrange z1 0 -1 withscores 1) "amy" 2) "4" 3) "rain" 4) "8" 127.0.0.1:6379>
- zremrangebyscore
# 根据分数范围删除value 127.0.0.1:6379> zremrangebyscore z1 5 8 (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> zrange z1 0 -1 withscores 1) "amy" 2) "4" 127.0.0.1:6379>
- zscore
# 获取value对应的分数 127.0.0.1:6379> zscore z1 amy "4" 127.0.0.1:6379>
- zinterstore
# 添加几个value用于测试 127.0.0.1:6379> zadd z1 10 alex 5 jack 88 Bob (integer) 3 127.0.0.1:6379> zrange z1 0 -1 withscores 1) "amy" 2) "4" 3) "jack" 4) "5" 5) "alex" 6) "10" 7) "Bob" 8) "88" 127.0.0.1:6379> # 创建一个新key z2 127.0.0.1:6379> zadd z2 7 alex 9 jack 10 Bob (integer) 3 127.0.0.1:6379> zrange z2 0 -1 withscores 1) "alex" 2) "7" 3) "jack" 4) "9" 5) "Bob" 6) "10" 127.0.0.1:6379>
# zinterstore用来将多个集合(必须指定几个)相同value的分数相加,并存储到新的集合; 下面的数字2,就是指定要将2个集合(z1和z2)进行合并分数相加。 127.0.0.1:6379> zinterstore z3 2 z1 z2 (integer) 3 127.0.0.1:6379> 127.0.0.1:6379> zrange z3 0 -1 withscores 1) "jack" 2) "14" 3) "alex" 4) "17" 5) "Bob" 6) "98" 127.0.0.1:6379>
-
zunionstore
- zscan
其他操作
- delete
127.0.0.1:6379> keys * 1) "names3" 2) "names4" 3) "Test" 4) "Test2" 5) "z3" 6) "z2" 7) "z1" 127.0.0.1:6379> del "Test" (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> keys * 1) "names3" 2) "names4" 3) "Test2" 4) "z3" 5) "z2" 6) "z1" 127.0.0.1:6379>
- exists
查看是否存在
- keys xx*
# 模糊查询 127.0.0.1:6379> keys name* 1) "names3" 2) "names4" 127.0.0.1:6379>
- expire
127.0.0.1:6379> hset info name amy (integer) 1 127.0.0.1:6379> hget info name "amy" # 使info这个key 3秒后过期 127.0.0.1:6379> expire info 3 (integer) 1 127.0.0.1:6379> hget info name (nil) 127.0.0.1:6379>
- rename
127.0.0.1:6379> hset info name amy (integer) 1 # 将info这个key改成info-test 127.0.0.1:6379> rename info info-test OK 127.0.0.1:6379> hget info-test name "amy" # 可以看到去查看info这个key,已经不存在了 127.0.0.1:6379> hget info name (nil) 127.0.0.1:6379>
- move
默认redis中有16个DB(0-15),可以通过select 来切换db
move可以将某个db的key移到另一个db中(前提是另一个db中没有相同名称的key才会移动成功)
127.0.0.1:6379> keys * 1) "names3" 2) "names4" 3) "Test2" 4) "z3" 5) "info-test" 6) "z2" 7) "z1" # 将Test2移到db 2中 127.0.0.1:6379> move Test2 2 (integer) 1 # 进入db 2中 127.0.0.1:6379> select 2 OK 127.0.0.1:6379[2]> keys * 1) "Test2" 127.0.0.1:6379[2]>
- randomkey
随机获取一个key
- type
查看key的类型
- 管道
用于在python中同时执行生成多个key
import redis import time pool = redis.ConnectionPool(host='127.0.0.1',port=6379,db=5) r = redis.Redis(connection_pool=pool) # 建立管道 pipe = r.pipeline() # 通过管道建立name1 pipe.set('name1','Bob') # 这里sleep 30秒,30秒之内,我们在redis-cli的db5中,去查看name1和age1是否被生成,来测试该程序是否会通过pipe.execute()统一执行管道定义的命令,而不是一个一个执行命令的。 time.sleep(30) pipe.set('age1','23') # 用来统一执行pipe.set('name1','Bob')和pipe.set('age1','23') pipe.execute()
执行结果:
# 30秒之内去查看name1和age这两个key,可以看到并没有执行 127.0.0.1:6379[5]> get name1 (nil) 127.0.0.1:6379[5]> get age1 (nil) 127.0.0.1:6379[5]> 127.0.0.1:6379[5]> get name1 (nil) 127.0.0.1:6379[5]> 127.0.0.1:6379[5]> get age1 (nil) # 30秒之后再查看,可以看到这两个key,被统一执行了。 127.0.0.1:6379[5]> get name1 "Bob" 127.0.0.1:6379[5]> get age1 "23" 127.0.0.1:6379[5]>
发布订阅
- Python RabbitMQ.Redis,Memcache
- python之redis
- python小程序:以后台服务方式 定时 监视redis队列 (anaconda3.5.2)
- redis连接python主从
- python访问redis
- PHP和python操作Redis
- 第三百五十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码
- hello world python redis
- python连接MySQL、MongoDB、Redis、memcache等数据库的方法
- python scrapy 安装 lxml 报 ERROR: 'xslt-config' 不是内部或外部命令,也不是可运行的程序的解决办法。
- 【LeetCode with Python】 Pascal's Triangle
- python(39):argparse的用法,从外部传入指定参数
- python操作redis
- python操作redis进行发布和订阅消息
- python redis启用线程池管理
- Python——redis发布者/订阅者笔记
- Python以邮件的方式发送由各个区服Redis数据库内存使用情况组成的Zabbix Screen图片
- python 实现类似tweproxy 和codes的功能的redis代理功能
- python2.7 操作 redis 的基本方法
- Python获取Redis所有Key以及内容的方法