您的位置:首页 > 数据库 > Redis

Python39 Redis

2019-10-25 16:14 1501 查看

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]>

发布订阅

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: