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

Redis基础

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

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 的日志缓存、 部分业务的订阅发布系统
计数器: 访问排行榜、商品浏览数等和次数相关的数值统计场景
缓存: 数据查询、 电商网站商品信息、 新闻内容
微博/微信社交场合: 共同好友、 点赞评论等 python

Redis的安装

yum安装Redis

在centos系统上须要基于epel源进行安装c++

[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、表示内核将检查是否有足够的可用内存供应用进程使用;若是有足够的可用内存,内存申请容许;不然,内存申请失败,并把错误返回给应用进程。
# 一、表示内核容许分配全部的物理内存,而无论当前的内存状态如何。
# 二、表示内核容许分配超过全部物理内存和交换空间总和的内存

[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 和 AOFgit

RDB模式

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

RDB模式的优缺点

优势:redis

  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 即每秒执行一次 fsyncvim

Redis数据类型

字符串(string)

  字符串是全部编程语言中最多见的和最经常使用的数据类型,并且也是 redis 最基本的数据类型之一,并且 redis 中全部的 key 的类型都是字符串。centos

添加一个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
相关文章
相关标签/搜索