Redis-基本命令

Scroll Down

redis 操作命令

String
set [key] [value]<br>
setnx [key] [value] #只有当key不存在时,set key进入redis<br>
get [key] [value]

List
LINDEX [key] [index] #获取key对应的下标值
LRANGE [key] [startIndex] [endIndex] #拿key从startIndex到endIndex的值,如果endIndex=-1,表示从startIndex开始拿到队尾
LSET [key] [index] [value] #setkey的index位置为value
LLEN [key] #获取key的长度
LPUSH [key] [value] #添加value到key的头
LPUSH [key] [value1 value2 value3] #添加多个数到list头,最后list头顺序为value3,value2,value1...
RPUSH [key] [value] #添加value到key的尾
RPOP [key] #移除并且获得key最后面的值
LPOP [key] #移除并且获得key最前面的值
LREM [key] [count] [value]
count > 0:删除等于value从头到尾移动的元素
count < 0:删除等于value从尾部移动到头部的元素
count = 0:删除所有等于的元素value。

Set

后续补上...

Map
HSET key field value #set field-value键值对进入key对应的Hash
HSETNX key field value #set value到key的field字段
HGET key field #获取key的filed字段的值
HLEN key #获取key里面所有filed的长度
HDEL key field/[field1 field2...] #删除key里面一个或者多个field
HGETALL key #获取Hash里面key的所有field和value
HEXISTS key field #判断是否存在field在key对应的Hash中
HKEYS key #获取所有key对应Hash里面所有的field
HMGET key field/[field1 field2...]<br> #获取key对应的Hash里面field对应的所有value,或者[field1,field2...]对应的所有value
HMSET key field value/[filed1 value1 field2 value2...] #set 一个或者多个filed value键-值对进入key对应的Hash
HVALS key#拿到Hash里面key的所有value
HSTRLEN key field#拿到Hash的长度里面field的value长度

Redis Lua脚本

eval "" numberKeys Key/[key1 key2 key3...] argv/[argv1 argv2 argv3...]
eval一共4个参数
1."Lua script":在双引号内是要执行的Lua脚本
2.numberKeys: 要传入到Luc script里面key的数量,如果没有key,则numberKeys=0
3.key/:传入到Lua脚本里面的key,和numberKeys数量对应,当numberKeys=0时,不用传入key但是一定要传入numberKeys=0
4.argv/:传入到Lua脚本里面的参数个数,类似与java main()里面的args[]参入,可以理解为脚本入参
当有key或者argv传入Lua script时,无论是key还是argv,都会在Lua脚本里面有对应的KEYS[index]/ARGV[index],来和传入的值相对应,也就是KEYS[1] KEYS[2]会分别对应参数列表里面的key1 key2,argv同理。

##示例1
127.0.0.1:6004> eval "return {KEYS[2],KEYS[1],ARGV[2],ARGV[1],ARGV[3]}" 2 key1 key2 ARGV1 ARGV2 troy
1) "key2"
2) "key1"
3) "ARGV2"
4) "ARGV1"
5) "troy"

##示例2
##0表示没有key被传入,只传入一个参数name,在脚本里面用作key
127.0.0.1:6004> eval "return redis.call('get',ARGV[1])" 0 name
"troy"

##示例3
##0表示没有key被传入,但是脚本执行set时用的key是通过传入的参数来获取
127.0.0.1:6004> eval "return redis.call('set',ARGV[1],ARGV[2])" 0 sex boy
OK
127.0.0.1:6004> keys *
1) "sex"
2) "name"
3) "user"
127.0.0.1:6004> get sex
"boy"

##示例4
##1表示传入一个key,用作set时的key
127.0.0.1:6004> eval "return redis.call('set',KEYS[1],ARGV[1])" 1 age 23
OK
127.0.0.1:6004> keys *
1) "sex"
2) "name"
3) "age"
4) "user"
127.0.0.1:6004> get age
"23"

redis配置

redis.conf
daemonize yes(配置redis server后台运行)
port 6379
bind 127.0.0.1(绑定当前机器ip,否则会很悲剧)
dir /usr/local/redis_cluster/redis(指定数据文件保存位置,不同redis server指定不同位置,否则会很悲剧,主从机也使用各自不同的位置)
cluster-enable yes
cluster-config-file nodes6379.conf(6379最好对应端口号)
cluster-node-timeout 5000(设置集群失效时间是5s)
appendonly yes
appendfilename “appendonly.aof”
min-slaves-to-write 1
min-slaves-max-lag 10
(如果主节点无法写入至少1个从服务器,将停止接受写入,这个无法写入至少1个节点意味着如果主从连接已断开,或者未向我们发送超过指定max-lag秒数的异步确认。
举例说明:在一个拥有3个redis和3个哨兵的节点即1主2从3哨兵,其中redis1 sentinel1在节点1上,同理r2/s2在节点2,r3/s3在节点3上。
最初的情况redis3为主节点,同时客户端A会写数据到redis3,然后redis3的数据会同步到r2和r1,在某一时刻,节点3失去了与节点1和节点2的连接,那么r3/s3都会断开,这时候s1和s2推举r1做为新的master,同时新的客户端会写入数据到r1,然后r1数据同步到r2,但是客户端A此时不知道仍然将数据写入到r3,一段时间后节点3恢复了与节点1和节点2的通讯,r3做为从节点假如到主从集群中,然后r3会同步r1的数据,那么在这段时间内客户端A写入到r3的数据会丢失,为了防止这样的情况我们可以设置min-slaves-to-write 1和min-slaves-max-lag 10)
sentinel.conf
daemonize yes(配置redis哨兵后台运行)
dir /Users/qujf/programefile/redis_cluster/data/6000/(解除挂载信息目录)
sentinel monitor mymaster 192.168.194.131 6381 2(设置,主名称,ip地址,端口号 参入选举的哨兵数)
sentinel down-after-milliseconds mymaster 3000(sentinel心跳检测主3秒内无响应,视为挂掉,开始切换其他从为主)
sentinel parallel-syncs mymaster 1(每次最多可以有1个从同步主。一个从同步结束,另一个从开始同步)
sentinel failover-timeout mymaster 18000(主从切换超时时间)

部署

Redis Replication链接
Redis哨兵部署参考Redis官方文档链接
博客园参考链接
redis replication--done 6000(master) 6001(replication)
redis sentinel--done 6000(master) 6001/6002(replication) 6000/6001/6002(sentinel)

redis多哨兵架构

1主2从3哨兵,配置参考redis.conf和sentinel.conf

redis哨兵启动顺序

src/redis-server redis.conf(启动redis server)
src/redis-cli -p 6000(启动6000端口号redisServer的客户端)
src/redis-sentinel sentinel.conf(启动redis哨兵服务)
src/redis-cli -p 26000(启动26000端口号的redis哨兵客户端)
src/redis-cli -p 6000 DEBUG sleep 30(设置6000端口的redis server睡眠30秒后从新连接,这个命令可以用来测试主节点挂掉哨兵是否会切换新的主节点)
src/redis-cli -p 6000 shutdown(停止6000端口号redisServer)
src/redis-cli -p 26000 shutdown(停止26000端口号server)

redis cluster

redis集群模式启动命令
src/redis-server ../6004/redis.conf
src/redis-cli -c -p 6004 #-c:意思使用集群模式启动客户端
redis-cli --cluster add-node 127.0.0.1:6010 127.0.0.1:6005 #添加新的6010节点进入一个已有集群,第二个参数6005为已有集群中的任一节点
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:6004 --cluster-slave #添加7006为replication进入已有集群,会将7006随机分配给集群里面replication节点最少的master
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:6006 --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e #添加7006为replication进入已有集群,将7006分配给id=3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e的master
查看cluster状态,登陆任意一个node client
cluster info #查看集群信息
cluster nodes #查看集群所有node
src/redis-cli --cluster check 127.0.0.1:6004 #检查节点状态
创建集群命令
Redis 5.0之后的版本
5.0之前的版本参考redis官方文档:https://redis.io/topics/cluster-tutorial
src/redis-cli --cluster create 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 127.0.0.1:6007 127.0.0.1:6008 127.0.0.1:6009 --cluster-replicas 1
其他参数都没什么好解释的,最后--cluster-replicas 1:意思是为每个master创建一个1一个replication, 但是要注意的是redis node列表顺序是前三个是master,后三个是replication,即1:1关系这个也是根据--cluster-replicas 1这个参数来定的,假如--cluster-replicas 2,那么前三个为master,后面replication的排列顺序我没做测试有兴趣的同学可以试试,看看是选择6007/6008给6004做replication,还是依次6007/6010是6004的replication
配置集群redis.conf打开的参数
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

troyMac:redis $ src/redis-cli --cluster create 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 127.0.0.1:6007 127.0.0.1:6008 127.0.0.1:6009 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6007 to 127.0.0.1:6004
Adding replica 127.0.0.1:6008 to 127.0.0.1:6005
Adding replica 127.0.0.1:6009 to 127.0.0.1:6006
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: d5312e4b4428b899b4b191c446f9f96fbce64ccb 127.0.0.1:6004
   slots:[0-5460] (5461 slots) master
M: cce5531ca0db57b1ac9697ae1fedbd776ee69219 127.0.0.1:6005
   slots:[5461-10922] (5462 slots) master
M: c17ce7c2853ff1f24ec060fe14e80674d7604520 127.0.0.1:6006
   slots:[10923-16383] (5461 slots) master
S: 30ad9a39229388132baf9a6b66dca0118170c7c4 127.0.0.1:6007
   replicates c17ce7c2853ff1f24ec060fe14e80674d7604520
S: 6569bd92d59d1853a34393e38d3a6577986b80e5 127.0.0.1:6008
   replicates d5312e4b4428b899b4b191c446f9f96fbce64ccb
S: ad0b13804402efff139200bed19c91472c9a16af 127.0.0.1:6009
   replicates cce5531ca0db57b1ac9697ae1fedbd776ee69219
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 127.0.0.1:6004)
M: d5312e4b4428b899b4b191c446f9f96fbce64ccb 127.0.0.1:6004
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 30ad9a39229388132baf9a6b66dca0118170c7c4 127.0.0.1:6007
   slots: (0 slots) slave
   replicates c17ce7c2853ff1f24ec060fe14e80674d7604520
S: 6569bd92d59d1853a34393e38d3a6577986b80e5 127.0.0.1:6008
   slots: (0 slots) slave
   replicates d5312e4b4428b899b4b191c446f9f96fbce64ccb
M: c17ce7c2853ff1f24ec060fe14e80674d7604520 127.0.0.1:6006
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: cce5531ca0db57b1ac9697ae1fedbd776ee69219 127.0.0.1:6005
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: ad0b13804402efff139200bed19c91472c9a16af 127.0.0.1:6009
   slots: (0 slots) slave
   replicates cce5531ca0db57b1ac9697ae1fedbd776ee69219
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
troyMac:redis $

结果测试:

127.0.0.1:6009> keys *
1) "name"
127.0.0.1:6009> set age 28
-> Redirected to slot [741] located at 127.0.0.1:6004
OK
127.0.0.1:6004> keys *
1) "age" 
redis哨兵模式主从和redis集群区别:

1.主从是读写分离,从节点都是read-only不能写入,redis主节点负责写入;
2.哨兵是一个单独的服务来监控主从节点,当主节点挂掉会切换从节点为主节点,如果主节点在从新启动,会以从节点从新加入哨兵主从模式;
3.集群的所有节点都可以写入,但是哨兵主从模式下的replication节点是不能写入的,这点请注意;
4.哨兵主从模式是通过同步主节点数据到从节点从而实现主备,因此主从节点数据会保持一直;集群是有多个主从结构构成,即会有多个master,同时每个master会有各自对应的replication,所以集群中所有master会共同保存数据,然后各自master和自己对应的replication数据保持一致;
举个例子:如果主节点有1000个key的数据,如果有两个从节点,那么这两个从节点也都各自会有1000条数据;但是redis集群做到了分布式存储,即一个拥有3个主节点的集群,每个主节点会有自己的从节点做主备,但是三个主节点之间是共同存储1000个key的数据,从而做到分布式存储,同时各个主节点都有从节点做到容灾。
举例说明:当我们在A master节点存储一个key到集群中,集群有可能会把这个key保存到B master,同时B master对应的从节点也会有保存该key的记录,但是我们访问该key时,可以在任何一个集群节点都可以访问到该key。