Redis使用简记

清除当前数据库 (默认16个数据库,0—15)flushdb

清除全部数据库的内容 FLUSHALL

查看所有的keykeys *

设置key过期时间EXPIRE name 10

查看当前key的剩余时间ttl name

查看当前key的一个类型type name

判断某一个key是否存在EXISTS key1

追加字符串,如果当前key不存在,就相当于setkeyAPPEND key1 "hello"

可以设置步长,指定增量INCRBY views 10

截取字符串 [0,3]GETRANGE key1 0 3

设置key3 的值为 hello,30秒后过期setex key3 30 "hello"

如果mykey 不存在,创建mykey;如果mykey存在,创建失败setnx mykey "redis"

同时设置多个值mset k1 v1 k2 v2 k3 v3

同时获取多个值mget k1 k2 k3

以上同时操作存在原子性,同时成功或同时失败。

设置一个user:1 对象 值为 json字符来保存一个对象set user:1 {name:zhangsan,age:3}

1
2
mset user:1:name zhangsan user:1:age 2
mget user:1:name user:1:age

如果不存在值,则返回 nil,如果存在值,获取原来的值,并设置新的值getset db redis

List操作

l list r

将一个值或者多个值,插入到列表头部 (左)LPUSH list one

展示列表中所有的值LRANGE list 0 -1

移除list的第一个元素Lpop list

通过下标获得 list 中的某一个值!lindex list 1

返回列表的长度Llen list

通过下标截取指定的长度,这个list已经被改变了,截断了只剩下截取的元素ltrim mylist 1 2

移除列表的最后一个元素,将他移动到新的列表中rpoplpush mylist myotherlist

将某个具体的value插入到列把你中某个元素的前面或者后面!LINSERT mylist before "world" "other"

Set操作

set集合中添加匀sadd myset "hello"

查看指定set的所有值SMEMBERS myset

判断某一个值是不是在set集合中SISMEMBER myset hello

获取set集合中的内容元素个数 scard myset

移除set集合中的指定元素srem myset hello

随机抽选出指定个数的元素 SRANDMEMBER myset 2

随机删除一些set集合中的元素spop myset

将一个指定的值,移动到另外一个set集合smove myset myset2 "kuangshen"

交集SINTER key1 key2

并集SUNION key1 key2

Hash操作

本质和String类型没有太大区别,还是一个简单的key-vlaue

hash 更适合于对象的存储,String更加适合字符串存储

set一个具体 key-vlauehset myhash field1 kuangshen

获取一个字段值hget myhash field1

获取hash表的字段数量hlen myhash

只获得所有fieldhkeys myhash

只获得所有valuehvals myhash

Zset有序集合操作

在set的基础上,增加了一个权重值

添加一个值zadd myset 1 one

显示全部的数据按权重从小到大ZRANGEBYSCORE salary -inf +inf

从大到进行排序ZREVRANGE salary 0 -1

显示全部的用户并且附带成绩ZRANGEBYSCORE salary -inf +inf withscores

显示工资小于2500员工的升序排序ZRANGEBYSCORE salary -inf 2500 withscores

移除有序集合中的指定元素zrem salary xiaohong

获取指定区间的成员数量zcount myset 1 3

Geospatial 地理位置

Redis GEOADD 命令_将指定的地理空间位置(纬度、经度、名称)添加到指定的key中

添加地理位置(一般从数据集直接导入)geoadd china:city 116.40 39.90 beijing

获取指定的城市的经度和纬度GEOPOS china:city beijing

查看上海到北京的直线距离GEODIST china:city beijing shanghai km

以110,30 这个经纬度为中心,寻找方圆1000km内的城市GEORADIUS china:city 110 30 1000 km

找出位于指定元素周围的其他元素GEORADIUSBYMEMBER china:city beijing 1000 km

将二维的经纬度转换为一维的字符串geohash china:city beijing chongqi

GEO 底层的实现原理其实就是 Zset!我们可以使用Zset命令来操作geo

移除指定元素zrem china:city beijing

Hyperloglog

优点:占用的内存是固定,2^64 不同的元素的技术,只需要废 12KB内存!如果要从内存角度来比较的
话 Hyperloglog 首选。存在0.81% 错误率! 统计UV任务,可以忽略不计

创建第一组元素 mykeyPFadd mykey a b c d e f g h i j

统计 mykey 元素的基数数量PFCOUNT mykey

Bitmap

1
2
3
4
5
BASH
setbit name 0 1
setbit name 1 1
setbit name 2 0
getbit sign 2

好像数组存储,值只有0 1

统计1的数量bitcount sign

事务

Redis事务没有没有隔离级别的概念

Redis单条命令式保存原子性的,但是事务不保证原子性

开启事务multi

命令入队

执行事务exec

取消事务DISCARD

异常类型:

  • 编译型异常(代码有问题,命令有错) ,事务中所有的命令都不会被执行
  • 运行时异常(1/0), 如果事务队列中存在语法性,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常

监视(watch)

乐观锁,更新数据的时候去判断一下,在此期间是否有人修改过这个数据。即通过version判断是否一致。

若没有变化,可以执行,有变化则执行失败。

监视命令:watch name

密码

设置密码:config set requirepass "psw"

查看密码:config get requirepass

登录:auth "psw"

主从复制

作用:

1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务
的冗余。
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务
(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写
少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4、高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复
制是Redis高可用的基础。

配置:

查看当前库的信息info replication

需要修改配置文件(redis.conf),每个节点需要对应一个配置文件,主要修改以下信息:

1、端口
2、pid 名字
3、log文件名字
4、dump.rdb 名字

设置从节点,配置主节点地址(暂时有效,若要一直配置,在配置文件中设置):SLAVEOF 127.0.0.1 6379

自己当主机!SLAVEOF no one

如果主节点有密码,需要在从节点配置文件中设置masterauth psw

主从同步原理:

Slave 启动成功连接到 master 后会发送一个sync同步命令
Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行
完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master 继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行! 我们的数据一定可以在从机中
看到

哨兵模式

开启:

先配置哨兵配置文件sentinel.conf

启动哨兵redis-sentinel kconfig/sentinel.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
BASH
# 哨兵sentinel实例运行的端口 默认26379
port 26379
# 哨兵sentinel的工作目录
dir /tmp
# 哨兵sentinel监控的redis主节点的 ip port
# master-name 可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 配置多少个sentinel哨兵统一认为master主节点失联 那么这时客观上认为主节点失联了
# sentinel monitor
sentinel monitor mymaster 127.0.0.1 6379 2
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供
密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds
sentinel down-after-milliseconds mymaster 30000
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
这个数字越小,完成failover所需的时间就越长,
但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面:
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那
里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,
slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout
社会目前程序员饱和(初级和中级)、高级程序员重金难求!(提升自己!)
Redis缓存穿透和雪崩
服务的高可用问题!
在这里我们不会详细的区分析解决方案的底层!
Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一
些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据
的一致性要求很高,那么就不能使用缓存。
另外的一些典型问题就是,缓存穿透、缓存雪崩和缓存击穿。目前,业界也都有比较流行的解决方案。
sentinel failover-timeout mymaster 180000
# SCRIPTS EXECUTION
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知
相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),
将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信
息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配
置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无
法正常启动成功。
#通知脚本
# shell编程
# sentinel notification-script
sentinel notification-script mymaster /var/redis/notify.sh
# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已
经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
#
# 目前总是“failover”,
# 是“leader”或者“observer”中的一个。
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通
信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh # 一般都是由运维来配
置!

优点:
1、哨兵集群,基于主从复制模式,所有的主从配置优点,它全有
2、 主从可以切换,故障可以转移,系统的可用性就会更好
3、哨兵模式就是主从模式的升级,手动到自动,更加健壮!
缺点:
1、Redis 不好啊在线扩容的,集群容量一旦到达上限,在线扩容就十分麻烦!
2、实现哨兵模式的配置其实是很麻烦的,里面有很多选择!