xredis

概览

What is Redis?
Redis is an open-source, networked, in-memory, key-value data store with optional durability. It is written in ANSI C. The development of Redis is sponsored by Redis Labs today; before that, it was sponsored by Pivotal and VMware. According to the monthly ranking by DB-Engines.com, Redis is the most popular key-value store. The name Redis means REmote DIctionary Server.

Redis 是一个开源,基于内存的高性能 key-Value 数据库, 可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs 等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过 Redis Sentinel 提供高可用,通过 Redis Cluster 提供自动分区。Redis是一种键值对的数据存储方式,主要存放在内存中,也可以做持久化,就是把内存中的数据刷新到磁盘上。

Redis常用的三个功能有: 数据库,缓存,消息队列。

http://try.redis.io/ Redis在线测试,直接操作Redis数据库。
https://redis.io/  
http://download.redis.io/releases/
http://download.redis.io/releases/redis-4.0.14.tar.gz
http://redisdoc.com/  
http://download.redis.io/releases/redis-4.0.14.tar.gz

软件功能
      1 高速读写
      2 数据类型丰富
      3 支持持久化
      4 多种内存分配及回收策略
      5 支持事物
      6 消息队列、消息订阅
      7 支持高可用
      8 支持分布式分片集群

消息队列产品
      1 rabbit-MQ (OpenStack)
      2 Zero-MQ   (SaltStack)
      3 Kafka     (Java)
      4 Redis     

安装

mkdir -p /xdata; cd /xdata
yum install tcl gcc -y

wget http://fs.as4k.com:7778/chfs/shared/bare-metal/dp265/redis/redis-4.0.14.tar.gz
tar xf redis-4.0.14.tar.gz
cd /xdata/redis-4.0.14

make
make test

cp redis.conf redis.conf.bak
egrep -v "^$|^#" redis.conf.bak > redis.conf

cp sentinel.conf sentinel.conf.bak
egrep -v "^$|^#" sentinel.conf.bak > sentinel.conf

配置

############# 一份参考的配置文件 #######################################

cat /xdata/redis-4.0.14/redis.conf
daemonize yes
protected-mode no
port 6379
logfile "/xdata/redis-4.0.14/redis.log"
dir /xdata/redis-4.0.14
dbfilename dump.rdb
bind 0.0.0.0
#slaveof 192.168.1.52 6379
#从库追加最后一行

############# 常用配置文件简单解释 #######################################

daemonize yes                          #守护进程模式启动
port 6379                              #端口
logfile /etc/redis/6379/redis.log      #日志文件位置
dir /etc/redis/6379                    #持久化数据文件存储位置
dbfilename dump.rdb                    #RDB持久化数据文件名称
bind 0.0.0.0                           #暴露在全网
requirepass  123456                    #连接需要输入密码
slaveof 192.168.1.52 6379              #主从复制的时候加在从库后面

更详细的解释可以参考: 
cat /xdata/redis-4.0.14/redis.conf.bak
cat /xdata/redis-4.0.14/sentinel.conf.bak

启停

################## 启动 #############################################
/xdata/redis-4.0.14/src/redis-server  /xdata/redis-4.0.14/redis.conf

############### 查看日志和状态 #######################################
tailf /xdata/redis-4.0.14/redis.log
/xdata/redis-4.0.14/src/redis-cli -h localhost -p 6379 keys "*"
/xdata/redis-4.0.14/src/redis-cli -h localhost -p 6379 info

############### 停止 ################################################
/xdata/redis-4.0.14/src/redis-cli -h localhost -p 6379 shutdown 或者直接 kill process-id
pgrep redis  | xargs -n 1 kill; sleep 2; ps aux | grep redis

kill还是比较平滑的,kill -9较为粗暴

############### 清空数据 #############################################
pgrep redis  | xargs -n 1 kill; sleep 2; ps aux | grep redis; rm -f  /xdata/redis-4.0.14/dump.rdb

~~~~~~~ INFO: 如果觉得执行命令用绝对路径不方便,可假如到 /etc/profile 环境变量

基础语句

######################### 进入交互模式 ##################################################
/xdata/redis-4.0.14/src/redis-cli -h localhost -p 6379

localhost:6379> help
redis-cli 4.0.14
To get help about Redis commands type:
      "help @<group>" to get a list of commands in <group>
      "help <command>" for help on <command>
      "help <tab>" to get a list of possible help topics
      "quit" to exit

To set redis-cli preferences:
      ":set hints" enable online hints
      ":set nohints" disable online hints
Set your preferences in ~/.redisclirc

redis-cli是一个客户端,可以连接本机或者远端的redis server

################### 客户端连接帮助 ################################################

[root@mgr002 redis-4.0.14]# /xdata/redis-4.0.14/src/redis-cli --help
redis-cli 4.0.14

Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
  -h <hostname>      Server hostname (default: 127.0.0.1).
  -p <port>          Server port (default: 6379).
  -s <socket>        Server socket (overrides hostname and port).
  -a <password>      Password to use when connecting to the server.
  -u <uri>           Server URI.
  -r <repeat>        Execute specified command N times.
  -i <interval>      When -r is used, waits <interval> seconds per command.
                     It is possible to specify sub-second times like -i 0.1.
  -n <db>            Database number.
  -x                 Read last argument from STDIN.
......
  --help             Output this help and exit.
  --version          Output version and exit.

When no command is given, redis-cli starts in interactive mode.
Type "help" in interactive mode for information on available commands
and settings.

################### 查询和设置key ################################################
[root@mgr001 redis-4.0.14]# /xdata/redis-4.0.14/src/redis-cli -h localhost -p 6379
localhost:6379> set name xiaowang
OK
localhost:6379> keys *
1) "name"
localhost:6379> get name
"xiaowang"

################### 未分类 ################################################

127.0.0.1:26380> ping
PONG
redis-cli --version
redis-server --version
redis-cli ping

构建主从复制

192.168.1.52  master node1
192.168.1.45  slave  node2
192.168.1.54  slave  node3

######################### 更改三台机器的redis.conf配置文件 ####################### 

cat /xdata/redis-4.0.14/redis.conf
daemonize yes
protected-mode no
port 6379
logfile "/xdata/redis-4.0.14/redis.log"
dir /xdata/redis-4.0.14
dbfilename dump.rdb
bind 0.0.0.0

slaveof 192.168.1.52 6379
#从库追加最后一行 (node2,node3,机器有上面一行)

######################### 启停 ##########################################
与单机启停一致,分别在3台机器正常启动即可,参考上文

######################### 验证 ##########################################
/xdata/redis-4.0.14/src/redis-cli -h localhost -p 6379 info replication
输出细节见后文

高可用-sentinel

######################### 构建3台机器之间的主从复制 ################################
这是前提条件,参考上文,使用的机器IP地址也参考上文

######################### 3台机器全都使用下面的配置 ##########################################
cat << 'EOF' > /xdata/redis-4.0.14/sentinel.conf
bind 0.0.0.0
port 26379
dir /xdata/redis-4.0.14
logfile "/xdata/redis-4.0.14/redis-sentinel.log"
daemonize yes
protected-mode no
sentinel monitor mymaster 192.168.1.52 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
EOF

配置的详细解释参考 cat /xdata/redis-4.0.14/sentinel.conf.bak
我这里解释1条 sentinel monitor mymaster 192.168.1.52 6379 2
      mymaster 起的名字
      192.168.1.52  master ip地址,本文即node1地址
      6379          master监听的端口
      2             表示如果有2个sentinel认为某个redis实例挂了,则该redis真正挂了

这份配置文件会被sentinel程序动态修改

######################### 启停 ##########################################
/xdata/redis-4.0.14/src/redis-sentinel /xdata/redis-4.0.14/sentinel.conf
tailf /xdata/redis-4.0.14/redis-sentinel.log

kill `pgrep sentinel`
直接用kill,节省学习成本

######################### 验证 ##########################################
/xdata/redis-4.0.14/src/redis-cli -h localhost -p 26379 info Sentinel

######################### 注意事项 ##########################################
验证命令执行后没有输出信息 ? 
嗯,搭建失败,建议把sentinel和redis都kill掉,同时检查redis和sentinel的配置文件,这2份配置文件都有可能被后台自动修改,然后重来

刚开始状态正常,过一会显示down ?
嗯,搭建失败,参考上一问,检查配置,重新搭建 

动态查看和修改配置信息

/xdata/redis-4.0.14/src/redis-cli -h localhost -p 6379 config get "*"
## 
**查看所有设置参数**
127.0.0.1:6379> CONFIG GET *

**查看指定参数**
127.0.0.1:6379> CONFIG GET BIND

**命令行修改配置参数**
127.0.0.1:6379> CONFIG SET requirepass 123
上面的修改是临时生效,不会改动配置文件,重启`redis-server`之后恢复配置文件里的设置。

登陆密码认证配置

bind 127.0.0.1       #只允许本地连接
bind 10.0.0.51       #只允许51机器连接
requirepass  123456  #连接需要输入密码

127.0.0.1:6379> KEYS *
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH zls
OK

在命令行直接输入密码
redis-cli -a 123456

冗余详细信息-输出细节

######################### 文件结构 ################################################################################
[root@mgr001 redis-4.0.14]# ls -lrht  --full-time /xdata/redis-4.0.14
total 25M
drwxrwxr-x  8 root root 4.0K 2019-03-19 00:23:22.000000000 +0800 utils
drwxrwxr-x 10 root root 4.0K 2019-03-19 00:23:22.000000000 +0800 tests
-rwxrwxr-x  1 root root  281 2019-03-19 00:23:22.000000000 +0800 runtest-sentinel
-rwxrwxr-x  1 root root  280 2019-03-19 00:23:22.000000000 +0800 runtest-cluster
-rwxrwxr-x  1 root root  271 2019-03-19 00:23:22.000000000 +0800 runtest
-rw-rw-r--  1 root root  21K 2019-03-19 00:23:22.000000000 +0800 README.md
-rw-rw-r--  1 root root 4.2K 2019-03-19 00:23:22.000000000 +0800 MANIFESTO
-rw-rw-r--  1 root root  151 2019-03-19 00:23:22.000000000 +0800 Makefile
-rw-rw-r--  1 root root   11 2019-03-19 00:23:22.000000000 +0800 INSTALL
-rw-rw-r--  1 root root 1.5K 2019-03-19 00:23:22.000000000 +0800 COPYING
-rw-rw-r--  1 root root 1.8K 2019-03-19 00:23:22.000000000 +0800 CONTRIBUTING
-rw-rw-r--  1 root root   53 2019-03-19 00:23:22.000000000 +0800 BUGS
-rw-rw-r--  1 root root 163K 2019-03-19 00:23:22.000000000 +0800 00-RELEASENOTES
drwxrwxr-x  6 root root 4.0K 2020-05-06 16:01:08.427984300 +0800 deps
drwxrwxr-x  3 root root 4.0K 2020-05-06 16:01:57.189775625 +0800 src
-rw-r--r--  1 root root  58K 2020-05-06 16:04:46.612050588 +0800 redis.conf.bak
-rw-r--r--  1 root root 1.4K 2020-05-06 16:41:44.245574570 +0800 dpredis-conf
-rw-r--r--  1 root root 7.8K 2020-05-06 16:51:35.978050310 +0800 sentinel.conf.bak
-rw-rw-r--  1 root root  140 2020-05-08 14:53:36.505241379 +0800 redis.conf
-rw-r--r--  1 root root  176 2020-05-08 15:14:19.080991573 +0800 dump.rdb
-rw-r--r--  1 root root  22K 2020-05-08 15:14:19.115991424 +0800 redis.log
-rw-rw-r--  1 root root  714 2020-05-08 15:16:37.359407056 +0800 sentinel.conf
-rw-r--r--  1 root root  25M 2020-05-08 15:16:37.359407056 +0800 redis-sentinel.log

######################### 主从复制,输出细节 ########################################################################
[root@node1 redis-4.0.14]# /xdata/redis-4.0.14/src/redis-cli -h localhost -p 6379 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.45,port=6379,state=online,offset=405229,lag=0
slave1:ip=192.168.1.54,port=6379,state=online,offset=405090,lag=0
master_replid:c30b7912ec538ad83f9969fae62eeca926482b9f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:405368
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:405368

[root@node2 redis-4.0.14]# /xdata/redis-4.0.14/src/redis-cli -h localhost -p 6379 info replication
# Replication
role:slave
master_host:192.168.1.52
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:405924
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c30b7912ec538ad83f9969fae62eeca926482b9f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:405924
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:405924

[root@node3 redis-4.0.14]# /xdata/redis-4.0.14/src/redis-cli -h localhost -p 6379 info replication
# Replication
role:slave
master_host:192.168.1.52
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:406202
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:c30b7912ec538ad83f9969fae62eeca926482b9f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:406202
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:406202

######################### 进程信息 ###########################################################################################

[root@mgr003 redis-4.0.14]# ps aux | grep redis
root     14782  0.1  0.0 147464  9688 ?        Ssl  15:14   0:03 /xdata/redis-4.0.14/src/redis-server 0.0.0.0:6379
root     14789  0.1  0.0 145416  7704 ?        Ssl  15:16   0:04 /xdata/redis-4.0.14/src/redis-sentinel 0.0.0.0:26379 [sentinel]

[root@mgr001 redis-4.0.14]# netstat -lntup | grep redis
tcp        0      0 0.0.0.0:26379           0.0.0.0:*               LISTEN      25984/redis-sentine 
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      25971/redis-server  

######################### sentinel高可用,输出细节 #########################################################################
[root@node1 redis-4.0.14]# /xdata/redis-4.0.14/src/redis-cli -h localhost -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.52:6379,slaves=2,sentinels=3

[root@node2 redis-4.0.14]# /xdata/redis-4.0.14/src/redis-cli -h localhost -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.52:6379,slaves=2,sentinels=3

[root@node3 redis-4.0.14]# /xdata/redis-4.0.14/src/redis-cli -h localhost -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.52:6379,slaves=2,sentinels=3

最后一行稍微解释下:
      name=mymaster                我们在配置文件里定义的master name
      status=ok                    正常工作,如果出现down之类的,说明搭建失败,重来
      address=192.168.1.52:6379    master redis地址和端口
      slaves=2                     有2个slave
      sentinels=3                  有3个sentinels实例

持久化

RDB持久化

https://weread.qq.com/web/reader/d0b326605b2833d0b9c2656kc1632f5021fc16a5320f3dc

RDB记录着数据的快照。
RDB持久化优缺点总结
优点:速度快,适合于用作备份,主从复制也是基于RDB持久化功能实现的。
缺点:会有数据丢失、导致服务停止几秒

#编辑配置文件
cat redis.conf
#持久化数据文件存储位置
dir /etc/redis/6379
#rdb持久化数据文件名
dbfilename dump.rdb
#900秒(15分钟)内有1个更改
save 900 1
#300秒(5分钟)内有10个更改
save 300 10
#60秒(1分钟)内有10000个更改
save 60 10000

save 每分钟 次数

save 900 1
save 300 10
save 60  10000

修改配置文件后,需要先停掉redis,再启动,使其生效

此时停掉redis,数据会自动持久化写磁盘,不用等待相应的时间。

生成了持久化文件dump.rdb,这个时候我们关机再重启,数据也还在。这份数据也可以scp到其它机器使用。

AOF持久化

AOF(append only file)只追加文件
AOF记录的所有写操作的命令,相当于记录着过程,在服务启动时通过重新执行这些命令来恢复数据。
AOF核心配置

#修改配置文件
[root@db01 redis]# vim /etc/redis/6379/redis.conf
#是否打开AOF日志功能
appendonly yes/no

#每一条命令都立即同步到AOF
appendfsync always
#每秒写一次
appendfsync everysec
#写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到AOF
appendfsync no


appendonly yes

appendfsync always
appendfsync everysec
appendfsync no
#这几个配置文件只能选一个

appendonly yes
appendfsync always

[root@db01 ~]# cat  /etc/redis/6379/redis.conf 
daemonize yes
port 6379
logfile /etc/redis/6379/redis.log
dir /etc/redis/6379
dbfilename dump.rdb
bind 127.0.0.1
requirepass zls
appendonly yes
appendfsync always

RDB 和 AOF ,我应该用哪一个?

1)一般来说,如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。
2)如果你非常关心你的数据,但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
3)有很多用户单独使用AOF,但是我们并不鼓励这样,因为时常进行RDB快照非常方便于数据库备份,启动速度也较之快,还避免了AOF引擎的bug。
4)个人感触:在企业中,通常都使用RDB来做持久化,因为一般redis是在做MySQL的缓存,就算缓存数据丢失,真实的数据还是在MySQL中,之所以用缓存是为了速度,性能而考虑,所以还是建议使用RDB持久化,相对来说会好一些,除非专门用redis来做一个key:value的数据库,而且数据很重要,那么可以考虑使用AOF

注意:基于这些原因,将来我们可能会统一AOF和RDB为一种单一的持久化模型(长远计划)。

数据类型

set设置的是字符串类型
可以使用EXISTS命令检查一个键是否存在

127.0.0.1:6379> set test xudao
OK
127.0.0.1:6379> exists test
(integer) 1

**修改key的名字**
RENAME xudao lidao

**查看key的类型**
type key
127.0.0.1:6379> get str
"hello"
127.0.0.1:6379> type str
string

**设置键值的生成时间**
127.0.0.1:6379> EXPIRE lidao 10
(integer) 1
等待10秒后,key自动过期
127.0.0.1:6379> KEYS *
(empty list or set)

set key value [EX seconds] [PX milliseconds] [NX|XX]
                多少秒过期    多少毫秒过期

还可以取消生存时间

**查看还剩多少时间过期**
127.0.0.1:6379> set lidao 2 EX 60
OK
127.0.0.1:6379> ttl lidao
(integer) 55


**删除一个key**
127.0.0.1:6379> set xudao 2
OK
127.0.0.1:6379> del xudao
(integer) 1
127.0.0.1:6379> get xudao
(nil)

## string字符类型

127.0.0.1:6379> set name zls
OK
127.0.0.1:6379> get name
"zls"
127.0.0.1:6379> type name
string

**设置多个key**
127.0.0.1:6379> mset name zls age 18 sex m

**查看多个key的值**
127.0.0.1:6379> mget name age sex
1) "zls"
2) "18"
3) "m"

**有创建并赋值,没有就创建**
127.0.0.1:6379> GETSET xudao 2
(nil)
127.0.0.1:6379> KEYS *
1) "age"
2) "name"
3) "xudao"
4) "sex"
127.0.0.1:6379> get xudao
"2"
127.0.0.1:6379> getset xudao 3
"2"
127.0.0.1:6379> get xudao
"3"

等于一下执行两个操作。

**设置数量递归增加**
默认加1
127.0.0.1:6379> INCR fans
(integer) 1
127.0.0.1:6379> INCR fans
(integer) 2
127.0.0.1:6379> INCR fans
(integer) 3
127.0.0.1:6379> get fans
"3"
指定增加多少
127.0.0.1:6379> INCRBY fans 2
(integer) 5
127.0.0.1:6379> INCRBY fans 5
10

**递减**
默认减1
127.0.0.1:6379> DECR fans 
9

**浮点数增加**
127.0.0.1:6379> INCRBYFLOAT fans 0.6


**字符串追加**
127.0.0.1:6379> get name
"zls"
127.0.0.1:6379> APPEND name bgx
(integer) 6
127.0.0.1:6379> get name
"zlsbgx"

**修改字符串指定位置的值**
127.0.0.1:6379> get name
"zlsbgx"
把第3个字符b改成m
127.0.0.1:6379> SETRANGE name 3 m
(integer) 6
127.0.0.1:6379> get name
"zlsmgx"


**返回字符串的长度**
127.0.0.1:6379> strlen name
(integer) 6

**获取字符串里范围字符**
127.0.0.1:6379> GET name
"zlsmgx"
127.0.0.1:6379> GETRANGE name 0 4
"zlsmg"
127.0.0.1:6379> 

**查看生存时间**
设置的是秒,也可以毫秒查看生存时间
127.0.0.1:6379> EXPIRE color 10
(integer) 1
127.0.0.1:6379> pttl color
(integer) 3048
127.0.0.1:6379> ttl color
(integer) -2

**字符串应用场景示例,粉丝数量增加**
127.0.0.1:6379> INCR fans
(integer) 6
127.0.0.1:6379> INCR fans
(integer) 7
127.0.0.1:6379> DECR fans
(integer) 6
127.0.0.1:6379> DECR fans
(integer) 5
127.0.0.1:6379> DECR fans
(integer) 4
127.0.0.1:6379> INCRBY fans 400000
(integer) 400004

## hash(字典)类型操作

应用场景: 存储部分变更的数据,如用户信息,商品信息等。
最接近表结构的一种类型。

127.0.0.1:6379> hset student name xudao
(integer) 1
127.0.0.1:6379> hget student name
"xudao"

127.0.0.1:6379> hset student name xudao
(integer) 1
127.0.0.1:6379> hset student age 80
(integer) 1
127.0.0.1:6379> hset student sex f
(integer) 1
127.0.0.1:6379> HGETALL student
1) "name"
2) "xudao"
3) "age"
4) "80"
5) "sex"
6) "f"

![](../../../xmd-img/mdimg/2018-12-10-15-23-19.png)

hmset student_zengdao name zengdao age 18 sex nan

**批量设置多个hash值**
127.0.0.1:6379> hmset student_zengdao name zengdao age 18 sex nan
OK
127.0.0.1:6379> HGETALL student_zengdao
1) "name"
2) "zengdao"
3) "age"
4) "18"
5) "sex"
6) "nan"

**删除hash类型的一个字段**
hdel student_lidao name

del是删除整个key


**hash类型某个字段自增**
127.0.0.1:6379> HINCRBY xudao fans 1
(integer) 1
127.0.0.1:6379> HINCRBY xudao fans 1
(integer) 2
127.0.0.1:6379> HINCRBY xudao fans 1
(integer) 3
127.0.0.1:6379> HINCRBY xudao fans 1
(integer) 4
127.0.0.1:6379> HINCRBY xudao fans 20
(integer) 24
127.0.0.1:6379> HINCRBY xudao fans 2
(integer) 26

127.0.0.1:6379> HGETALL car
1) "name"
2) "BMW"
3) "type"
4) "530"
5) "price"
6) "50w"
一个key相当于mysql里的一行数据

增加 -1 即是递减


List(列表)类型操作

应用场景: 消息队列系统

127.0.0.1:6379> LPUSH list zls
(integer) 1
127.0.0.1:6379> LPUSH list bgx
(integer) 2
127.0.0.1:6379> LPUSH list lidao
(integer) 3
127.0.0.1:6379> lpop list
"lidao"
127.0.0.1:6379> lpop list
"bgx"
127.0.0.1:6379> lpop list
"zls"

127.0.0.1:6379> help lpush

  LPUSH key value [value ...]
  summary: Prepend one or multiple values to a list
  since: 1.0.0
  group: list

127.0.0.1:6379> help lpop

  LPOP key
  summary: Remove and get the first element in a list
  since: 1.0.0
  group: list

127.0.0.1:6379> help rpop

  RPOP key
  summary: Remove and get the last element in a list
  since: 1.0.0
  group: list

**往里面追加内容**

127.0.0.1:6379> lpush teacher zls bgx lidao
(integer) 3
127.0.0.1:6379> lpop teacher
"lidao"
127.0.0.1:6379> rpop teacher
"zls"
127.0.0.1:6379> lpushx teacher girl
(integer) 2


127.0.0.1:6379> type teacher
list

**微信朋友圈模拟实现**
127.0.0.1:6379> LINSERT teacher before bgx niutao

127.0.0.1:6379> lpush wechat 'monday,bgx is a pig'
(integer) 1
127.0.0.1:6379> lpush wechat 'tuesday,zls is a nice boy'
(integer) 2
127.0.0.1:6379> lpush wechat 'wednesday,lidao is a good boy'
(integer) 3

127.0.0.1:6379> LRANGE wechat 0 -1
1) "wednesday,lidao is a good boy"
2) "tuesday,zls is a nice boy"
3) "monday,bgx is a pig"

Set(集合)类型操作

该集合不是有序集合。删除是随机的。

**增**
127.0.0.1:6379> sadd zls_fans bgx lidao xidaomimei

**删**
127.0.0.1:6379> sadd zls_fans bgx lidao xidaomimei
(integer) 3
127.0.0.1:6379> spop zls_fans
"xidaomimei"
srem zls_fans bgx

**改**
127.0.0.1:6379> sadd zls_fans bgx lidao xidaomimei
127.0.0.1:6379> sadd bgx_fans fengjie kjdh
讲小迷妹从zls_fans移动bgx_fans

**查**
127.0.0.1:6379> SISMEMBER zls_fans xiaomimei
127.0.0.1:6379> SISMEMBER bgx_fans xiaomimei
查看集合里的所有内容
127.0.0.1:6379> SMEMBERS bgx_fans
1) "fengjie"
2) "kjdh"
127.0.0.1:6379> SMEMBERS zls_fans
1) "lidao"
2) "bgx"
获取集合中元素的数量
127.0.0.1:6379> SCARD zls_fans
(integer) 2

127.0.0.1:6379> SRANDMEMBER bgx_fans
"kjdh"
127.0.0.1:6379> SRANDMEMBER bgx_fans
"fengjie"

**创建三个集合**
127.0.0.1:6379> sadd zls_fans bgx lidao xiaomimei
(integer) 3
127.0.0.1:6379> sadd bgx_fans zls lidao xiaomimei
(integer) 2
127.0.0.1:6379> sadd lidao_fans 0
(integer) 1

**比较三个集合的不同之处**
127.0.0.1:6379> sdiff zls_fans bgx_fans lidao_fans
1) "bgx"

**看三个集合都有的元素**
127.0.0.1:6379> sinter zls_fans bgx_fans
1) "xiaomimei"
2) "lidao"

**看三个集合的并集**
127.0.0.1:6379> SUNION zls_fans bgx_fans lidao_fans
1) "0"
2) "bgx"
3) "kjdh"
4) "xiaomimei"
5) "lidao"
6) "fengjie"
7) "zls"


有序集合

应用场景:

排行榜应用,取TOP N操作

**创建一个有序集合**
127.0.0.1:6379> zadd myzset 2 "two" 3 "three"

**删除有序集合**
127.0.0.1:6379> zrem myzset one two
里面没有one只能删掉一个two

**改**
127.0.0.1:6379> zincrby myzset 2 one
没有这个成员,就会创建。

**查**

127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "one"
2) "2"
3) "three"
4) "3"
127.0.0.1:6379> zrange myzset 0 -1
1) "one"
2) "three"

查看这里面成员的索引
127.0.0.1:6379> zrank myzset three
(integer) 1

Redis有0~15个库

**获取集合里所有的成员数量**
127.0.0.1:6379> zcard myzset
(integer) 2

**大于等于2小于等于10的分数有哪些**
127.0.0.1:6379> zcount myzset 2 10
(integer) 2
127.0.0.1:6379> zscore myzset three
"3"

127.0.0.1:6379> zadd english_score 100 "zls" 0 "lidao" 10 "bgx"
(integer) 3
127.0.0.1:6379> zrange english_score 0 -1
1) "lidao"
2) "bgx"
3) "zls"
127.0.0.1:6379> zrange english_score 0 -1 WITHSCORES
1) "lidao"
2) "0"
3) "bgx"
4) "10"
5) "zls"
6) "100"

参考资料

Redis Sentinel机制与用法
https://www.cnblogs.com/duanxz/p/4701831.html

Redis Sentinel集群部署
https://blog.csdn.net/sunbocong/article/details/85252071

https://redis.io/topics/quickstart
https://segmentfault.com/a/1190000002680804