Redis缓存的安装及基本数据类型命令的使用

Redis基础

  Redis 是一个开源的、遵循 BSD 协议的、基于内存的而且目前比较流行的键值数据库(key-value database),是一个非关系型数据库, redis 提供将内存通过网络远程共享的一种服务,提供类似功能的还有memcache,但相比 memcache, redis 还提供了易扩展、高性能、 具备数据持久性等功能。
  Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛, 目前 redis 在 DB-Engine 月排行榜https://db-engines.com/en/ranking 中一直比较靠前,而且一直是键值型存储类的首位。

Redis对比Memcached

  1. 支持数据的持久化:可以将内存中的数据保持在磁盘中,重启 redis 服务或者服务器之后可以从备份文件中恢复数据到内存继续使用。
  2. 支持更多的数据类型:支持 string(字符串)、 hash(哈希数据)、 list(列表)、 set(集合)、 zet(有序集合)
  3. 支持数据的备份:可以实现类似于数据的 master-slave 模式的数据备份,另外也支持使用快照+AOF。
  4. 支持更大的 value 数据: memcache 单个 key value 最大只支持 1MB,而 redis 最大支持 512MB。
  5. Redis 是单线程, 而 memcache 是多线程, 所以单机情况下没有 memcache 并发高, 但 redis 支持分布式集群以实现更高的并发, 单 Redis 实例可以实现数万并发。
  6. 支持集群横向扩展:基于 redis cluster 的横向扩展,可以实现分布式集群,大幅提升性能和数据安全性。
  7. 都是基于 C 语言开发。

Redis典型应用场景

Session 共享:常见于 web 集群中的 Tomcat 或者 PHP 中多 web 服务器 session 共享
消息队列: ELK 的日志缓存、 部分业务的订阅发布系统
计数器: 访问排行榜、商品浏览数等和次数相关的数值统计场景
缓存: 数据查询、 电商网站商品信息、 新闻内容
微博/微信社交场合: 共同好友、 点赞评论等

Redis的安装

yum安装Redis

在centos系统上需要基于epel源进行安装

[root@centos7-5 ~]#yum install -y redis

启动Redis服务并设置开机自启
[root@centos7-5 ~]# systemctl start redis && systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.

查看Redis版本
[root@centos7-5 ~]#redis-server -v
Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=7897e7d0e13773f

连接Redis并查看版本信息
[root@centos7-5 ~]#redis-cli
127.0.0.1:6379> info Server
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7897e7d0e13773f
redis_mode:standalone
os:Linux 3.10.0-957.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:9524
run_id:7a985888a7f121aece265bc47aab2c611dd92e17
tcp_port:6379
uptime_in_seconds:24
uptime_in_days:0
hz:10
lru_clock:61125
executable:/usr/bin/redis-server
config_file:/etc/redis.conf

编译安装Redis

官网下载Redis至服务器
[root@centos7-6 ~]#wget http://download.redis.io/releases/redis-4.0.14.tar.gz

解压
[root@centos7-6 ~]#tar -xf redis-4.0.14.tar.gz 
[root@centos7-6 ~]#cd redis-4.0.14/

安装依赖软件包
[root@centos7-6 redis-4.0.14]#yum install -y vim lrzsz tree screen psmisc lsof tcpdump wget ntpdate gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools iotop bc zip unzip zlib-devel bash-completion nfs-utils automake libxml2 libxml2-devel libxslt libxslt-devel perl perl-ExtUtils-Embed

安装Redis
[root@centos7-6 redis-4.0.14]#make PREFIX=/apps/redis install

创建redis配置文件
[root@centos7-6 redis-4.0.14]#mkdir /apps/redis/etc
[root@centos7-6 redis-4.0.14]#cp redis.conf /apps/redis/etc/

指定配置文件,启动redis
[root@centos7-6 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf 
# 启动警告
13303:M 12 Jun 20:42:10.037 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
13303:M 12 Jun 20:42:10.037 # Server initialized
13303:M 12 Jun 20:42:10.038 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
13303:M 12 Jun 20:42:10.038 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

解决启动时的警告信息

[root@centos7-6 redis-4.0.14]#vim /etc/sysctl.conf
net.core.somaxconn = 512    # backlog 参数控制的是三次握手的时候 server 端收到 client ack 确认号之后的队列值。
vm.overcommit_memory = 1    
# 0、表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
# 1、表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
# 2、表示内核允许分配超过所有物理内存和交换空间总和的内存

[root@centos7-6 redis-4.0.14]#sysctl -p
net.core.somaxconn = 512
vm.overcommit_memory = 1

# 开启大页内存动态分配,需要关闭让 redis 负责内存管理。
[root@centos7-6 redis-4.0.14]#echo never > /sys/kernel/mm/transparent_hugepage/enabled

此时再次启动Redis则不会出现警告信息

编写Redis服务启动脚本

[root@centos7-6 ~]#vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
#ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target

创建Redis用户和数据目录以及可执行程序的软连接

[root@centos7-6 ~]#useradd redis -s /sbin/nologin
[root@centos7-6 ~]#mkdir /apps/redis/{data,logs,run} 
[root@centos7-6 ~]#chown redis.redis /apps/redis/ -R
[root@centos7-6 ~]#ln -sv /apps/redis/bin/redis-* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’ # Redis性能测试工具
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’ # AOF文件检查工具
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’ # RDB文件检查工具
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’ # Redis客户端工具
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’   # 哨兵,软连接到server
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’   # Redis服务端

Redis启动验证

[root@centos7-6 ~]#systemctl daemon-reload 
[root@centos7-6 ~]#systemctl start redis.service 
[root@centos7-6 ~]#ss -ntl
State       Recv-Q Send-Q            Local Address:Port                           Peer Address:Port              
LISTEN      0      511                   127.0.0.1:6379                                      *:*  

[root@centos7-6 ~]#redis-cli 
127.0.0.1:6379> info Server
# Server
redis_version:4.0.14
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:3e5aec6afe61b942
....

Redis的连接方式

本机非密码连接

# redis-cli

跨主机非密码连接

# redis-cli -h HOSTNAME/IP -p PORT

跨主机密码链接

# redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD

python连接

#!/bin/env python
import redis
import time
pool = redis.ConnectionPool(host="192.168.36.116",
port=6379,password="")
r = redis.Redis(connection_pool=pool)
for i in range(100):
    r.set("k%d" % i,"v%d" % i)
    time.sleep(1)
    data=r.get("k%d" % i)
    print(data)

Redis配置文件

bind 0.0.0.0 #监听地址, 可以用空格隔开后多个监听 IP
protected-mode yes #redis3.2 之后加入的新特性, 在没有设置 bind IP 和密码的时候只允许访问127.0.0.1:6379
port 6379 #监听端口
tcp-backlog 511 #三次握手的时候 server 端收到 client ack 确认号之后的队列值。
timeout 0 #客户端和 Redis 服务端的连接超时时间,默认是 0,表示永不超时。
tcp-keepalive 300 #tcp 会话保持时间
daemonize no #认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成yes,当 redis 作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面
supervised no #和操作系统相关参数, 可以设置通过 upstart 和 systemd 管理 Redis 守护进程, centos 7以后都使用 systemd
pidfile /var/run/redis_6379.pid #pid 文件路径
loglevel notice #日志级别logfile "" #日志路径
databases 16 #设置 db 库数量,默认 16 个库
always-show-logo yes #在启动 redis 时是否显示 log
save 900 1 #在 900 秒内有一个键内容发生更改就出就快照机制
save 300 10
save 60 10000
stop-writes-on-bgsave-error no #快照出错时是否禁止 redis 写入操作
rdbcompression yes #持久化到 RDB 文件时,是否压缩, "yes"为压缩, "no"则反之
rdbchecksum yes #是否开启 RC64 校验,默认是开启
dbfilename dump.rdb #快照文件名
dir ./ #快照文件保存路径
replica-serve-stale-data yes #当从库同主库失去连接或者复制正在进行,从机库有两种运行方式: 1) 如果 replica-serve-stale-data 设置为 yes(默认设置),从库会继续响应客户端的读请求。 2) 如果 replicaserve-stale-data 设置为 no,除去指定的命令之外的任何请求都会返回一个错误"SYNC with master in progress"。
replica-read-only yes #是否设置从库只读
repl-diskless-sync no #是否使用 socket 方式复制数据, 目前 redis 复制提供两种方式, disk 和 socket, 如果新的 slave 连上来或者重连的 slave 无法部分同步,就会执行全量同步, master 会生成 rdb 文件, 有2 种方式: disk 方式是 master 创建一个新的进程把 rdb 文件保存到磁盘,再把磁盘上的 rdb 文件传递给 slave, socket 是 master 创建一个新的进程,直接把 rdb 文件以 socket 的方式发给 slave, disk 方式的时候,当一个 rdb 保存的过程中,多个 slave 都能共享这个 rdb 文件, socket 的方式就是一个个 slave顺序复制, 只有在磁盘速度缓慢但是网络相对较快的情况下才使用 socket 方式, 否则使用默认的 disk方式
repl-diskless-sync-delay 30 #diskless 复制的延迟时间, 设置 0 为关闭, 一旦复制开始还没有结束之前,master 节点不会再接收新 slave 的复制请求, 直到下一次开始
repl-ping-slave-period 10 #slave 根据 master 指定的时间进行周期性的 PING 监测
repl-timeout 60 #复制链接超时时间,需要大于 repl-ping-slave-period, 否则会经常报超时
repl-disable-tcp-nodelay no #在 socket 模式下是否在 slave 套接字发送 SYNC 之后禁用 TCP_NODELAY,如果你选择“yes”Redis 将使用更少的 TCP 包和带宽来向 slaves 发送数据。但是这将使数据传输到 slave 上有延迟, Linux 内核的默认配置会达到 40 毫秒, 如果你选择了 "no" 数据传输到 salve 的延迟将会减少但要使用更多的带宽
repl-backlog-size 1mb #复制缓冲区大小, 只有在 slave 连接之后才分配内存。
repl-backlog-ttl 3600 #多次时间 master 没有 slave 连接,就清空 backlog 缓冲区。
replica-priority 100 #当 master 不可用, Sentinel 会根据 slave 的优先级选举一个 master。最低的优先级的 slave,当选 master。而配置成 0,永远不会被选举。requirepass foobared #设置 redis 连接密码
rename-command #重命名一些高危命令
maxclients 10000 #最大连接客户端
maxmemory #最大内存,单位为 bytes 字节,8G 内存的计算方式 8(G)*1024(MB)*1024(KB)*1024(Kbyte),需要注意的是 slave 的输出缓冲区是不计算在 maxmemory 内。
appendonly no #是否开启 AOF 日志记录, 默认 redis 使用的是 rdb 方式持久化,这种方式在许多应用中已经足够用了。但是 redis 如果中途宕机,会导致可能有几分钟的数据丢失,根据 save 来策略进行持久化,Append Only File 是另一种持久化方式,可以提供更好的持久化特性。 Redis 会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时 Redis 都会先把这个文件的数据读入内存里,先忽略 RDB 文件。
appendfilename "appendonly.aof" #AOF 文件名
appendfsync everysec #aof 持久化策略的配置,no 表示不执行 fsync,由操作系统保证数据同步到磁盘,always 表示每次写入都执行 fsync,以保证数据同步到磁盘,everysec 表示每秒执行一次 fsync,可能会导致丢失这 1s 数据。
no-appendfsync-on-rewrite no #在 aof rewrite 期间,是否对 aof 新记录的 append 暂缓使用文件同步策略,主要考虑磁盘 IO 开支和请求阻塞时间。默认为 no,表示"不暂缓",新的 aof 记录仍然会被立即同步,Linux 的默认 fsync 策略是 30 秒,如果为 yes 可能丢失 30 秒数据, 但由于 yes 性能较好而且会避免出现阻塞因此比较推荐。
auto-aof-rewrite-percentage 100 # 当 Aof log 增长超过指定百分比例时,重写 log file, 设置为 0 表示不自动重写 Aof 日志,重写是为了使 aof 体积保持最小,而确保保存最完整的数据。
auto-aof-rewrite-min-size 64mb #触发 aof rewrite 的最小文件大小
aof-load-truncated yes #是否加载由于其他原因导致的末尾异常的 AOF 文件(主进程被 kill/断电等)
aof-use-rdb-preamble yes #redis4.0 新增 RDB-AOF 混合持久化格式,在开启了这个功能之后, AOF 重写产生的文件将同时包含 RDB 格式的内容和 AOF 格式的内容,其中 RDB 格式的内容用于记录已有的数据,而 AOF 格式的内存则用于记录最近发生了变化的数据,这样 Redis 就可以同时兼有 RDB 持久化和AOF 持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。
lua-time-limit 5000 #lua 脚本的最大执行时间, 单位为毫秒
cluster-enabled yes #是否开启集群模式,默认是单机模式
cluster-config-file nodes-6379.conf #由 node 节点自动生成的集群配置文件
cluster-node-timeout 15000 #集群中 node 节点连接超时时间
cluster-replica-validity-factor 10 #在执行故障转移的时候可能有些节点和 master 断开一段时间数据比较旧, 这些节点就不适用于选举为 master, 超过这个时间的就不会被进行故障转移
cluster-migration-barrier 1 #一个主节点拥有的至少正常工作的从节点, 即如果主节点的 slave 节点故障后会将多余的从节点分配到当前主节点成为其新的从节点。
cluster-require-full-coverage no #集群槽位覆盖, 如果一个主库宕机且没有备库就会出现集群槽位不全, 那么 yes 情况下 redis 集群槽位验证不全就不再对外提供服务,而 no 则可以继续使用但是会出现查询数据查不到的情况(因为有数据丢失)。
#Slow log 是 Redis 用来记录查询执行时间的日志系统, slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启 slow log 而损害 Redis 的速度。
slowlog-log-slower-than 10000 #以微秒为单位的慢日志记录, 为负数会禁用慢日志, 为 0 会记录每个命令操作。
slowlog-max-len 128 #记录多少条慢日志保存在队列,超出后会删除最早的, 以此滚动删除

Redis数据持久化

  redis 虽然是一个内存级别的缓存程序,即 redis 是使用内存进行数据的缓存的,但是其可以将内存的数据按照一定的策略保存到硬盘上,从而实现数据持久保存的目的, redis 支持两种不同方式的数据持久化保存机制,分别是 RDB 和 AOF

RDB模式

  RDB: 基于时间的快照, 只保留当前最新的一次快照, 特点是执行速度比较快,缺点是可能会丢失从上次快照到当前快照未完成之间的数据。
  RDB 实现的具体过程 Redis 从主进程先 fork 出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如 dump.rdb.temp,当数据保存完成之后再将上一次保存的 RDB 文件替换掉,然后关闭子进程,这样可以保存每一次做 RDB 快照的时候保存的数据都是完整的,因为直接替换 RDB文件的时候可能会出现突然断电等问题而导致 RDB 文件还没有保存完整就突然关机停止保存而导致数据丢失的情况,可以手动将每次生成的 RDB 文件进程备份,这样可以最大化保存历史数据。

RDB模式的优缺点

优点:

  1. RDB 快照保存了某个时间点的数据,可以通过脚本执行 bgsave(非阻塞)或者 save(阻塞)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本。
  2. 可以最大化 IO 的性能,因为父进程在保存 RDB 文件的时候唯一要做的是 fork 出一个子进程,然后的
  3. 操作都会有这个子进程操作,父进程无需任何的 IO 操作RDB 在大量数据比如几个 G 的数据,恢复的速度比 AOF 的快

缺点:

  1. 不能时时的保存数据,会丢失自上一次执行 RDB 备份到当前的内存数据
  2. 数据量非常大的时候,从父进程 fork 的时候需要一点时间,可能是毫秒或者秒

AOF模式

  AOF:按照操作顺序依次将操作添加到指定的日志文件当中,特点是数据安全性相对较高, 缺点是即使有些操作是重复的也会全部记录。
  AOF 和 RDB 一样使用了写时复制机制, AOF 默认为每秒钟 fsync 一次,即将执行的命令保存到 AOF 文件当中,这样即使 redis 服务器发生故障的话顶多也就丢失 1 秒钟之内的数据,也可以设置不同的 fsync策略,或者设置每次执行命令的时候执行 fsync, fsync 会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入 AOF 文件的 IO 影响。

AOF模式优缺点

AOF 的文件大小要大于 RDB 格式的文件
根据所使用的 fsync 策略(fsync 是同步内存中 redis 所有已经修改的文件到存储设备),默认是appendfsync everysec 即每秒执行一次 fsync

Redis数据类型

字符串(string)

  字符串是所有编程语言中最常见的和最常用的数据类型,而且也是 redis 最基本的数据类型之一,而且 redis 中所有的 key 的类型都是字符串。

添加一个KEY

127.0.0.1:6379> SET key1 value1 # 添加一个key
OK
127.0.0.1:6379> GET key1    # 获取一个key的内容
"value1"
127.0.0.1:6379> TYPE key1   # 查看key的类型
string
127.0.0.1:6379> SET name Darius ex 3    # 对key设置自动过期时间
OK
127.0.0.1:6379> KEYS *  # 查看所有key
1) "name"
2) "key1"
127.0.0.1:6379> KEYS *  # 超过设定的过期时间,自动取消预先设定的key
1) "key1"

删除一个key

127.0.0.1:6379> DEL key1
(integer) 1 # 删除一个key
127.0.0.1:6379> KEYS *
(empty list or set) # 空key

批量设置多个key

127.0.0.1:6379> MSET key1 value1 key2 value2    # 格式:一个key对应自己的key值
OK

批量获取多个key

127.0.0.1:6379> MGET key1 key2
1) "value1"
2) "value2"

追加数据

127.0.0.1:6379> APPEND key1 append
(integer) 12
127.0.0.1:6379> GET key1
"value1append"

数值递增

127.0.0.1:6379> SET num 10
OK
127.0.0.1:6379> INCR num
(integer) 11
127.0.0.1:6379> GET num
"11"
127.0.0.1:6379> INCR num
(integer) 12
127.0.0.1:6379> GET num
"12"

数值递减

127.0.0.1:6379> SET num 10
OK
127.0.0.1:6379> GET num
"10"
127.0.0.1:6379> DECR num
(integer) 9
127.0.0.1:6379> GET num
"9"
127.0.0.1:6379> DECR num
(integer) 8
127.0.0.1:6379> GET num
"8"
注:写入信息报错
(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.

# 此问题是由于快照出错时是否禁止 redis 写入操作,不能;进行持久化引起的。需要修改配置文件中stop-writes-on-bgsave-error 为no,重新启动redis即可

[root@centos7-6 ~]#grep 'stop-writes-on-bgsave-error' /apps/redis/etc/redis.conf 
stop-writes-on-bgsave-error no
[root@centos7-6 ~]#systemctl restart redis

返回字符串key长度

127.0.0.1:6379> STRLEN key1
(integer) 12

列表(list)

  列表是一个双向可读写的管道, 其头部是左侧尾部是右侧,一个列表最多可以包含 2^32-1 个元素即4294967295 个元素。

生成列表并插入数据

127.0.0.1:6379> LPUSH list1 darius tom jhon
(integer) 3
127.0.0.1:6379> TYPE list1
list

向列表追加数据

127.0.0.1:6379> LPUSH list1 a   # 左追加
(integer) 4
127.0.0.1:6379> RPUSH list1 b   # 右追加
(integer) 5

获取列表长度

127.0.0.1:6379> LLEN list1
(integer) 5

移除列表数据

127.0.0.1:6379> RPOP list1  # 最后一个
"b"
127.0.0.1:6379> LPOP list1  # 第一个
"a"

集合

  Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

生成集合key

127.0.0.1:6379> SADD set1 v1
(integer) 1
127.0.0.1:6379> SADD set2 v2 v4
(integer) 2
127.0.0.1:6379> TYPE set1
set
127.0.0.1:6379> TYPE set2
set

追加数值

127.0.0.1:6379> SADD set1 v2 v3 v4
(integer) 3
127.0.0.1:6379> SADD set1 v2    # 追加失败,追加的时候不能追加已经存在的数值
(integer) 0

查看集合的所有数据

127.0.0.1:6379> SMEMBERS set1
1) "v4"
2) "v2"
3) "v3"
4) "v1"
127.0.0.1:6379> SMEMBERS set2
1) "v4"
2) "v2"

获取集合的差集

# 差集: 已属于 A 而不属于 B 的元素称为 A 与 B 的差(集)
127.0.0.1:6379> SDIFF set1 set2
1) "v1"
2) "v3"

获取集合的交集

# 交集: 已属于 A 且属于 B 的元素称为 A 与 B 的交(集)
127.0.0.1:6379> SINTER set1 set2
1) "v4"
2) "v2"

获取集合的并集

# 并集:已属于 A 或属于 B 的元素为称为 A 与 B 的并(集)
127.0.0.1:6379> SUNION set1 set2
1) "v2"
2) "v1"
3) "v3"
4) "v4"

sorted set(有序集合)

  Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个 double(双精度浮点型)类型的分数, redis 正是通过分数来为集合中的成员进行从小到大的排序, 有序集合的成员是唯一的,但分数(score)却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1), 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储 40 多亿个成员)。

生成有序集合

127.0.0.1:6379> ZADD zset1 1 v1
(integer) 1
127.0.0.1:6379> ZADD zset1 2 v2
(integer) 1
127.0.0.1:6379> ZADD zset1 3 v3
(integer) 1
127.0.0.1:6379> ZADD zset1 4 v4
(integer) 1
127.0.0.1:6379> TYPE zset1
zset

127.0.0.1:6379> ZREVRANGE zset1 0 -1 withscores # 显示指定集合内所有key和key值情况
1) "v4"
2) "4"
3) "v3"
4) "3"
5) "v2"
6) "2"
7) "v1"
8) "1"

# 示例
127.0.0.1:6379> ZADD paihangbang 20 key1 10 key2 30 key3    # 添加集合
(integer) 3
127.0.0.1:6379> ZREVRANGE paihangbang 0 -1 WITHSCORES   # 显示集合内所有key与key值,发现按照顺序进行排列
1) "key3"
2) "30"
3) "key1"
4) "20"
5) "key2"
6) "10"

批量添加多个数值

127.0.0.1:6379> ZADD paihangbang 20 key1 10 key2 30 key3    
(integer) 3

获取集合的长度数

127.0.0.1:6379> ZCARD zset1
(integer) 4
127.0.0.1:6379> ZCARD paihangbang
(integer) 3

基于索引返回数值

127.0.0.1:6379> ZRANGE zset1 2 3
1) "v3"
2) "v4"
127.0.0.1:6379> ZRANGE zset1 0 2
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> ZRANGE zset1 1 3
1) "v2"
2) "v3"
3) "v4"

返回某个数值的索引

127.0.0.1:6379> ZRANK zset1 v2
(integer) 1
127.0.0.1:6379> ZRANK zset1 v1
(integer) 0

哈希(hash)

  hash 是一个 string 类型的 field 和 value 的映射表, hash 特别适合用于存储对象,Redis 中每个 hash 可以存储 232 - 1 键值对(40 多亿)。

生成hash key

127.0.0.1:6379> HSET hset1 name darius age 18
(integer) 2
127.0.0.1:6379> TYPE hset1
hash

获取hash key字段值

127.0.0.1:6379> HGET hset1 name
"darius"
127.0.0.1:6379> HGET hset1 age
"18"

删除一个hash key字段

127.0.0.1:6379> HDEL hset1 age
(integer) 1

获取所有hash表中的字段

127.0.0.1:6379> HSET hset1 name darius age 18
(integer) 1
127.0.0.1:6379> HKEYS hset1
1) "name"
2) "age"

Redis其他命令

CONFIG

  config 命令用于查看当前 redis 配置、以及不重启更改 redis 配置等

# 更改最大内存
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "0"
127.0.0.1:6379> CONFIG SET maxmemory 8589934592
OK
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "8589934592"

# 设置连接密码,这只之后立即生效,但推出当前运行环境即失效,若想长久保存还需要写入配置文件中
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> CONFIG SET requirepass 123456
OK
127.0.0.1:6379> CONFIG GET requirepass
(error) NOAUTH Authentication required. # 密码生效,须输入认证密码方可查询
127.0.0.1:6379> AUTH 123456 # 密码认证
OK
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "123456"

# 获取当前配置
127.0.0.1:6379> CONFIG GET *
  1) "dbfilename"
  2) "dump.rdb"
  3) "requirepass"
  4) "123456"
  5) "masterauth"
  6) ""
  7) "cluster-announce-ip"
  8) ""
  9) "unixsocket"
 10) ""
 11) "logfile"
 12) ""
 13) "pidfile"
 14) "/var/run/redis_6379.pid"
....

info

  显示当前节点 redis 运行状态信息

127.0.0.1:6379> info
# Server
redis_version:4.0.14
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:3e5aec6afe61b942
redis_mode:standalone
os:Linux 3.10.0-957.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:7582
run_id:b122e141e18e7e2b129dc7dc093cf107e14f045a
tcp_port:6379
uptime_in_seconds:4082
....

SELECT

  切换数据库

127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> 

KEYS

  查看当前库下的所有 key

127.0.0.1:6379> KEYS *
1) "paihangbang"
2) "key2"
3) "hset1"
4) "set1"
5) "zset1"
6) "key1"
7) "num"
8) "set2"
9) "list1"

BGSAVE

  手动在后台执行 RDB 持久化操作

127.0.0.1:6379> BGSAVE
Background saving started

DBSIZE

  返回当前库下的所有 key 数量

127.0.0.1:6379> DBSIZE
(integer) 9

FLUSHDB

  强制清空当前库中的所有 key

127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> KEYS *
(empty list or set)

FLUSHALL

  强制清空当前 redis 服务器所有数据库中的所有 key, 即删除所有数据

127.0.0.1:6379> FLUSHALL
OK
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章