redis常用操作

redis基本操作

1.对键进行重命名
rename key newkey
rename aa bb

实例****

127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]> set name lishuang
OK
127.0.0.1:6379[15]> keys *
1) "name"
127.0.0.1:6379[15]> RENAME name newname
OK
127.0.0.1:6379[15]> keys *
1) "newname"

2.随机返回一个键
randomkey

127.0.0.1:6379[15]> set test1 1
OK
127.0.0.1:6379[15]> set test2 2
OK
127.0.0.1:6379[15]> set test3 3
OK
127.0.0.1:6379[15]> set test4 4
OK
127.0.0.1:6379[15]> set test5 5
OK
127.0.0.1:6379[15]> set test6 6
OK
127.0.0.1:6379[15]> set test7 7
OK
127.0.0.1:6379[15]> set test8 8
OK
127.0.0.1:6379[15]> set test9 9
OK
127.0.0.1:6379[15]> set test10 10
OK
127.0.0.1:6379[15]> RANDOMKEY 
"test4"
127.0.0.1:6379[15]> RANDOMKEY 
"test9"
127.0.0.1:6379[15]> RANDOMKEY 
"test10"
127.0.0.1:6379[15]> RANDOMKEY 
"test4"


3.迁移键
move key db
move bb 4

127.0.0.1:6379[15]> move newname 1   #  将 newname 移动到数据库 1
(integer) 1
127.0.0.1:6379[15]> EXISTS newname   # newname 已经被移走  
(integer) 0
127.0.0.1:6379[15]> select 1          # 使用数据库 1
OK
127.0.0.1:6379[1]> keys *               # 证实 newname 被移到了数据库 1
1) "newname"

4.dump+restore实现redis节点之间的数据备份与还原

Redis DUMP 命令用于序列化给定 key ,并返回被序列化的值。

备份节点
dump key
获得十六进制序列

还原节点
restore key ttl 十六进制序列 #ttl为键值对的过期时间,为0表示永不过期

127.0.0.1:6379[1]> set  key1 "key dump"
OK
127.0.0.1:6379[1]> dump key1
"\x00\bkey dump\b\x00\xca\xef\"\xb3\x9c/\xde["
127.0.0.1:6379[1]> del key1
(integer) 1
127.0.0.1:6379[1]> keys *
1) "newname"
127.0.0.1:6379[1]> RESTORE key1 0  "\x00\bkey dump\b\x00\xca\xef\"\xb3\x9c/\xde["
OK
127.0.0.1:6379[1]> keys *
1) "key1"
2) "newname"

5.migrate实现redis节点之间数据的备份
migrate d_host d_port key | " d_db timeout [copy] [replace] [keys [key1 key2…]]
d_host:目标节点的IP
d_port:目标节点的端口
key | “”:如果备份一个键值对,则直接写键名,如果备份多个键值对使用""表示
d_db:目标节点的数据库编号
timeout:备份的超时时间,如果在指定时间内没有完成数据传输则备份失败
copy:源节点的数据拷贝到目标节点,如果不带copy则会删除源节点的数据
replace:如果目标节点存在同名的拷贝键值对,则进行替换,如果不带replace则不替换
keys:如果前面是",则在此处指定要拷贝的多个键值对

作用:如果redis数据量数据量有大量键, keys命令有可能造成redis阻塞,如果不清楚有多少键的情况下避免在生产环境使用keys命令Redis从2.8版本后,提供了一个新的命令scan,它能有效的解决keys命令存在的问题。和keys命令执行时会遍历所有键不同,scan采用渐进式遍历的方式来解决keys命令可能带来的阻塞问题,每次scan命令的时间复杂度是O(1),但是要真正实现keys的功能,需要执行多次scan。

Redis存储键值对实际使用的是hashtable的数据结构,那么每次执行scan,可以想象成只扫描一个字典中的一部分键,直到将字典中的所有键遍历完毕

migrate 192.168.10.102 6379 one 0 100
migrate 192.168.10.102 6379 one 0 100 replace
migrate 192.168.10.102 6379 “” 1 100 copy keys test two


6.渐进式遍历键

keys * 查看键的时候,因为数据库的数据库庞大,会导致阻塞,通过scan命令可以进行渐进式遍历键

  • SCAN 命令用于迭代当前数据库中的数据库键。
  • SSCAN 命令用于迭代集合键中的元素。
  • HSCAN 命令用于迭代哈希键中的键值对。
  • ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)

scan cursor [match pattern] [count number]
cursor:游标,用数值表示当前所在键值对的位置,0表示第一个键值对的位置,如果在某一次遍历完成值后返回的游标的值为0则表示已经将键值对遍历完一遍
match pattern:按条件进行查找
count number:指定每次遍历键的个数

scan 0
scan 3
scan 0 count 16
scan 0 count 3
scan 20 count 4
scan 0 match ‘m*’ count 5

127.0.0.1:6379[15]> keys *
 1) "test7"
 2) "test2"
 3) "test8"
 4) "test6"
 5) "test1"
 6) "test5"
 7) "test4"
 8) "test9"
 9) "test3"
10) "test10"

以 0 作为游标开始一次新的迭代, 一直调用 SCAN 命令, 直到命令返回游标 0 , 我们称这个过程为一次完整遍历127.0.0.1:6379[15]> mset a a b b c c d d e e f f g g h h i i j j k k l l m m n n o o p p q q r r s s t t u u v v w w x x y y z z
OK
127.0.0.1:6379[15]> scan 0
1) "44"
2)  1) "o"
    2) "t"
    3) "w"
    4) "newkey"
    5) "y"
    6) "k"
    7) "j"
    8) "f"
    9) "s"
   10) "v"
127.0.0.1:6379[15]> scan 44
1) "22"
2)  1) "c"
    2) "test9"
    3) "test8"
    4) "u"
    5) "test2"
    6) "test7"
    7) "g"
    8) "test4"
    9) "q"
   10) "d"
   11) "test5"
   127.0.0.1:6379[15]> scan 22
1) "21"
2)  1) "m"
    2) "x"
    3) "l"
    4) "p"
    5) "e"
    6) "r"
    7) "test6"
    8) "h"
    9) "b"
   10) "i"
127.0.0.1:6379[15]> scan 21
1) "0"
2) 1) "test1"
   2) "z"
   3) "test3"
   4) "test10"
   5) "n"
   6) "a"
使用得到的新的cursor=“21”,scan 21 返回结果cursor变成0,说明所有的键都已经遍历过了





通过match 'test*' 条件筛选

127.0.0.1:6379[15]> scan  0 match 'test*'
1) "44"
2) (empty list or set)
127.0.0.1:6379[15]> scan  44 match 'test*'
1) "22"
2) 1) "test9"
   2) "test8"
   3) "test2"
   4) "test7"
   5) "test4"
   6) "test5"
127.0.0.1:6379[15]> scan  22 match 'test*'
1) "21"
2) 1) "test6"
127.0.0.1:6379[15]> scan  21 match 'test*'
1) "0"
2) 1) "test1"
   2) "test3"
   3) "test10"

每次遍历键的次数
127.0.0.1:6379[15]> scan  0 match 'test*' count 20
1) "22"
2) 1) "test9"
   2) "test8"
   3) "test2"
   4) "test7"
   5) "test4"
   6) "test5"
127.0.0.1:6379[15]> scan 22 match 'test*' count 20
1) "0"
2) 1) "test6"
   2) "test1"
   3) "test3"
   4) "test10"


7.慢查询日志
修改慢查询日志的配置
vim redis.conf
修改:
slowlog-log-slower-than 10 #阈值,单位毫秒
slowlog-max-len 130 #慢查询日志最大日志条数

redis-cli shutdown ##如果开始了多个redis,则需要加端口关闭–port
redis-server redis.conf

[root@bogon ~]# redis-cli        ##如果要生成几条慢查询日志,migrate执行的时候毫秒数添加的长一点
127.0.0.1:6379> slowlog get
1) 1) (integer) 0
   2) (integer) 1604482716
   3) (integer) 291
   4) 1) "COMMAND"
   5) "127.0.0.1:55794"
   6) ""
127.0.0.1:6379> slowlog len
(integer) 2
127.0.0.1:6379> slowlog reset
OK
127.0.0.1:6379> slowlog get
(empty list or set)

redis常用功能
1.hyperloglogs:通过指令计算统计记录用户的访问量
2.GEO,地理位置定位,获取定位信息
3.数据持久化,将内存中的数据存放在硬盘中,实现永久保存数据
4.发布订阅
5.流水线
6.主从复制
7.哨兵
8.事务
9.位图bitmaps

1.流水线
目的:通过减少客户端与服务端之间的通信次数来提高程序的执行效率

实现:流水线可以将多条命令打包一起发送,并且再一次回复中接收所有被执行命令的结果,使用流水线功能可以有效提高程序执行多条命令的效率

2.事务
redis事务相关命令
multi:开启事务
exec:执行事务
discard:取消事务
watch:监控指定的键
unwatch:取消监控指定的键

正常开启事务
multi
set k1 v1
set k2 v2
exec

127.0.0.1:6379[14]> keys *
1) "to"
2) "go"
127.0.0.1:6379[14]> multi
OK
127.0.0.1:6379[14]> set 1 1
QUEUED
127.0.0.1:6379[14]> set 2 2
QUEUED
127.0.0.1:6379[14]> keys *
QUEUED
127.0.0.1:6379[14]> exec
1) OK
2) OK
3) 1) "2"
   2) "1"
   3) "to"
   4) "go"
##多看几遍就懂了不解释了

撤销事务
multi
set k1 11
set k2 22
discard

127.0.0.1:6379[14]> multi
OK
127.0.0.1:6379[14]> set 33 33
QUEUED
127.0.0.1:6379[14]> set 44 44
QUEUED
127.0.0.1:6379[14]> discard
OK
127.0.0.1:6379[14]> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379[14]> 
##没有可以处理的事务

当事务中存在格式有问题的命令时会导致事务提交时所有的命令都不执行
multi
set k1 11
set k2 #格式错了,没有指定键的值
get k1
exec #提交事务时所有的指令都不执行

127.0.0.1:6379[14]> multi 
OK
127.0.0.1:6379[14]> set 33 44
QUEUED
127.0.0.1:6379[14]> set 44
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379[14]> exec
(error) EXECABORT Transaction discarded because of previous errors.
##因为先前的错误而放弃事物

当事务中命令的格式都正确,但是有的命令因为键值对值的问题执行失败时不会影响其它指令的执行
multi
set k1 11
incr k2 #k2的值是v2不能进行计数,所有该指令在事务提交执行时会报错,但不会影响另外两条指令的执行
get k1
exec

通过watch监控一个或多个键值对,在事务提交时,如果监控的键值对已经被其他客户端修改了数据,那么提交事务时不会执行事务中的所有指令
终端A
watch k2
multi
set k2 22
set k1 33
get k1

终端B
set k2 66

终端A
exec #提交事务,事务中的命令都不会执行,因为终端B已经提前修改了监控的k2的值

终端A:
127.0.0.1:6379[14]> select 13
OK
127.0.0.1:6379[13]> set newkey two
OK
127.0.0.1:6379[13]> watch newkey
OK
127.0.0.1:6379[13]> multi
OK
127.0.0.1:6379[13]> set newkey one 
QUEUED

终端B
127.0.0.1:6379[13]> set newkey yes
OK


终端A
127.0.0.1:6379[13]> exec
(nil)
127.0.0.1:6379[13]> get newkey
"yes"



取消监控
终端A
watch k2
unwatch
multi

set k2 22
set k1 33
get k1

终端B
set k2 66

终端A
exec #提交事务,事务中所有的命令可以成功执行,因为在事务开启前就已经取消对k2的监控

终端A
127.0.0.1:6379[13]> UNWATCH
OK

127.0.0.1:6379[13]> multi
OK
127.0.0.1:6379[13]> set newkey aa
QUEUED
127.0.0.1:6379[13]> set low low
QUEUED
终端B
127.0.0.1:6379[13]> set newkey bbb
OK


终端A
127.0.0.1:6379[13]> exec
1) OK
2) OK
127.0.0.1:6379[13]> get newkey
"aa"
127.0.0.1:6379[13]> get low
"low"

3.hyperloglogs:通过字符串数据类型开发,用于统计ip,id,用户访问量,邮件等信息,每个hyperloglogs类型键值对只占12k容量,可以用很小的内存完成总数的统计

创建一个hyperloglogs键值对
pfadd key value value2 value3…
pfadd 20200730 xiaoming xiaohong xiaolin lala xixi hehe haha
pfadd 20200729 xiaoming xiaohong

统计多天的访问人数
pfcount key key2… #对多个键值对的值进行计数,如果有重复的值会去重
pfcount 20200729 20200730

127.0.0.1:6379[13]> pfadd 1803 aa bb cc dd
(integer) 1
127.0.0.1:6379[13]> pfadd 1804 ee ff gg
(integer) 1
127.0.0.1:6379[13]> pfadd 1805 aa bb gg
(integer) 1

127.0.0.1:6379[13]> pfcount 1803 1804
(integer) 7
127.0.0.1:6379[13]> pfcount 1803 1805
(integer) 5



统计多天的访问人数并记录数值
pfmerge d_key key1 key2 …
pfmerge 202007 20200729 20200730

127.0.0.1:6379[13]> pfmerge hahaha 1803 1805
OK
值就不看了 太长了

4.发布订阅
发布订阅模式包含两种角色,分别是发布者和订阅者,订阅者可以订阅一个频道或多个频道,发布者可以向指定的频道推送消息,所有订阅此频道的订阅者都会收到此消息

订阅消息
subscribe channel channel2 channel3…
subscribe sjk
返回信息
subscribe:如果消息类型为subscribe,则表明返回的是订阅者订阅成功
sjk:订阅的频道名
integer 1:订阅者订阅的频道的数量
message:如果消息类型是message,则表明这是订阅的频道推送的消息
sjk:订阅的频道名
‘welcome…’:推送的消息的具体内容

推送消息
publish channel message
publish sjk ‘welcome to sjk channel’ #推送完消息发布的数值表示当前有几个订阅者接收到了该消息
s*
取消订阅
unsubscribe [channel]

按模式进行订阅和取消订阅,表示匹配任意多个字符,?表示匹配任意一个字符
psubscribe [partten]
psubscribe s

查看活跃订阅的频道
pubsub channels

查看频道订阅数
pubsub numsub channel

查看模式订阅数
pubsub numpat

客户端A
127.0.0.1:6379> SUBSCRIBE tv1 tv2 tv3

客户端B
127.0.0.1:6379[13]> PUBLISH tv1 message
(integer) 1
127.0.0.1:6379[13]> PUBLISH tv1 woshilishuang
(integer) 1

客户端A
127.0.0.1:6379> SUBSCRIBE tv1 tv2 tv3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "tv1"
3) (integer) 1
1) "subscribe"
2) "tv2"
3) (integer) 2
1) "subscribe"
2) "tv3"
3) (integer) 3
1) "message"
2) "tv1"
3) "message"
1) "message"
2) "tv1"
3) "woshilishuang"


客户端B
127.0.0.1:6379> pubsub channels
1) "tv2"
2) "tv3"
3) "tv1"
127.0.0.1:6379> pubsub numsub tv1
1) "tv1"
2) (integer) 1
127.0.0.1:6379> pubsub numpat
(integer) 0


5.GEO
GEO,地理消息定位,通过有序集合实现,把某个地点的名称以及该地点的经纬度以有序集合的方式进行记录,数据被保存后可以通过GEO的特殊指令查询
有效的经度:-180度-180度
有效的纬度:-85.05112878到85.05112878

添加地理位置信息
geoadd key 经度 纬度 地点1 经度 纬度 地点2 经度 纬度 地点3…
geoadd cities 116.28 39.55 beijing 117.12 39.08 tianjin 14.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding

获取成员的地理位置信息
geopos key 地点1 地点2 …
geopos cities beijing tangshan

获取两个地理位置间的距离
geodist key 地点1 地点2 m|km
geodist cities beijing tianjin km

获取指定范围内的地理信息位置集合
georadius key 经度 纬度 radius m|km [withcoord] [withdist] [count count]
withcoord:返回的结果中包含经纬度
withdist:返回的结果中包含距离中心点位置的距离
count count:指定返回的数量

georadius cities 120.20 40.10 300 km
georadius cities 120.20 40.10 300 km withcoord
georadius cities 120.20 40.10 300 km withcoord withdist
georadius cities 120.20 40.10 300 km withcoord withdist count 1

通过成员名返回指定成员距离范围内的地点
georadiusbymember key 地点 m|km [withcoord] [withdist] [count count] [asc|desc]
georadiusbymember cities tianjin 100 km
georadiusbymember cities tianjin 100 km withdist asc
georadiusbymember cities tianjin 100 km withdist desc

127.0.0.1:6379> geoadd cities 116.28 39.55 beijing 117.12 39.08 tianjin 14.29 38.02  shijiazhuang  118.01 39.38 tangshan 115.29 38.51 baoding
(integer) 5
127.0.0.1:6379> geopos cities beijing   查看经纬度
1) 1) "116.28000229597091675"
   2) "39.5500007245470826"
127.0.0.1:6379> geopos cities tianjin
1) 1) "117.12000042200088501"
   2) "39.0800000535766543"

想看距离多少 默认单位为m
127.0.0.1:6379> geodist cities beijing baoding
"143864.5624"
127.0.0.1:6379> geodist cities beijing baoding km
"143.8646"

127.0.0.1:6379> georadius cities 120.20 40.10 300 km withcoord
1) 1) "tianjin"
   2) 1) "117.12000042200088501"
      2) "39.0800000535766543"
2) 1) "tangshan"
   2) 1) "118.01000028848648071"
      2) "39.37999951111137165"
127.0.0.1:6379> georadius cities 120.20 40.10 300 km withcoord withdist
1) 1) "tianjin"
   2) "287.3216"
   3) 1) "117.12000042200088501"
      2) "39.0800000535766543"
2) 1) "tangshan"
   2) "203.6999"
   3) 1) "118.01000028848648071"
      2) "39.37999951111137165"
127.0.0.1:6379> georadius cities 120.20 40.10 300 km withcoord withdist count 1
1) 1) "tangshan"
   2) "203.6999"
   3) 1) "118.01000028848648071"
      2) "39.37999951111137165"

6.位图
通过二进制0和1表示并记录用户的活跃数据,可以减少因为统计用户活跃而占用的存储空间,还可以提高数据的写入读取速度

创建一个位图键值对,来记录用户小明一周的活跃状态
setbit key offset value
setbit xiaoming 1 1 #第一天签到了
setbit xiaoming 2 0 #第二天没签到

查看小明指定日期的活跃状态
getbit key offset
getbit xiaoming 1 #查看小明第一天的活跃状态
getbit xiaoming 2 #查看小明第二天的活跃状态

redis提供四种日志级别
debug:记录大量日志信息,适用于开发测试阶段
verbose
notice:
warning:

127.0.0.1:6379> setbit lishuang1 1 1
(integer) 1
127.0.0.1:6379> setbit lishuang1 2 0
(integer) 0
127.0.0.1:6379> getbit lishuang1 1
(integer) 1
127.0.0.1:6379> getbit lishuang1 2
(integer) 0



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值