目录

  • 1. redis的概述
  • 2. redis的优点
  • 3. redis的常见应用场景
  • 4. redis与memcache的对比
  • 5. 源码安装redis
  • 5.1 安装步骤:
  • 6. redis命令工具
  • 7. redis测试工具 redis-benckmark
  • 8. Redis数据库常用命令(数据库内部操作)
  • 8.1 存放和获取数据
  • 8.2 重命名
  • 8.3 判断键值是否存在,键值类型,删除键
  • 8.4 查看当前数据库的key的数目
  • 8.5 redis 设置密码
  • 9. Redis多数据库常用命令
  • 9.1 多数据库间的切换
  • 9.2 多数据库间移动数据
  • 9.3 清除数据库内数据
  • 10. redis的数据类型
  • 10.1 String类型
  • 10.1.1 SET/GET/APPEND/STRLEN
  • 10.1.2 INCR/ DECR/ I NCRBY/ DECRBY
  • 10.1.3 GETSET
  • 10.1.4 SETEX
  • 10.1.5 SETNX
  • 10.1.6 MSET/MGET/MSETNX
  • 10.2 List类型
  • 10.2.1 LPUSH/LPUSHX/LRANGE
  • 10.2.2. LPOP/LLEN
  • 10.2.3 LREM/LSET/LINDEX/LTRIM
  • 10.2.4 LINSERT
  • 10.2.5 BPUSH/RPUSHX/RPOP/RPOPLPUSH
  • 10.3 Hash类型
  • 10.3.1 HSET/HGET/HDEL/HEXISTS/HLEN/HSETNX
  • 10.3.2 HINCRBY
  • 10.3.3 HGETALL/HKEYS/HVALS/HMGET/HMSET
  • 10.4 Set类型(无序集合)
  • 10.4.1 SADD/SMEMBERS/SCARE/SISMEMBER
  • 10.4.2 SPOP/SREM/SRANDMEMBER/SMOVE
  • 10.5 Sorted Set类型(有序集合)
  • 10.5.1 ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK
  • 10.5.2 ZRANGE BY SCORE/ZREM RANGE BYRANK/ZREM RANGE BY SCORE
  • 10.5.3 ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK


1. redis的概述

Redis是一个开源的、使用C语言编写的NoSQL数据库。
Redis基于内存运行并支持持久化(支持存储在磁盘),采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。

Redis服务器程序默认是单进程模型:
Redis服务在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率

开双进程的好处:
备份
抗高并发的同时尽量不给CPU造成太大的压力

2. redis的优点

1.具有极高的数据读写速度:数据读取的速度最高可达到110000 次/s,数据写入速度最高可达到81000 次/s
2.支持丰富的数据类型:支持key-value、 Strings、 Lists、Hashes ( 散列值)、Sets 及Ordered Sets等数据类型操作

例如以下种类:
string  字符串     (可以为整形、浮点和字符型,统称为元素)
list      列表      (实现队列,元素不唯一,先入先出原则)
set      集合:      (各不相同的元素)
hash hash散列值:    ( hash的key必须是唯一的)
set /ordered ets    集合/有序集合

3.支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
4.Redis所有操作都是原子性的:一起成功,一起失败
5.支持数据备份:即master-salve 模式的数据备份

3. redis的常见应用场景

Redis作为基于内存运行的数据库,缓存是其最常应用的场景之一。
除此之外,Redis常见应用场景还包括获取最新n个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录。

4. redis与memcache的对比

redis:支持比较多的数据类型(String/list/set/sortset/hash),redis支持集合计算的(set类型支持),每个key最大数据存储量为1G,redis是新兴的内存缓存技术,对各方面支持不完善,支持持久化操作。

memcache:老牌的内存缓存技术,对相关领域支持比较丰富,window和linux都可以使用,各种框架(tp/yii等等)都支持使用,session的信息可以非常方便的保存到该memcache中,每个key保存的数据量最大为1M,支持的数据类型比较单一,就是String类型,不支持持久化。

两者的相同之处在于把数据保存在内存中。

注意:以上的区别必须要知道哦,在进行选择第三方优化的时候,就可以根据实际情况来定了!

5. 源码安装redis

5.1 安装步骤:

[root@server ~]# hostnamectl set-hostname redis
[root@server ~]# su
[root@redis ~]# ntpdate ntp.aliyun.com
 8 Aug 17:16:43 ntpdate[18504]: adjust time server 203.107.6.88 offset -0.002983 sec
[root@redis ~]# yum -y install gcc gcc-c++ make
[root@redis ~]# cd /opt
[root@redis opt]# ls
redis-5.0.7.tar.gz  rh
[root@redis opt]# tar xzvf redis-5.0.7.tar.gz #解包
#由于Redis源码包中直接提供了Makefile 文件,所以在解压完软件包后,不用先执行./configure进行配置,可直接执行make与make install命令进行安装
[root@redis opt]# cd redis-5.0.7/
[root@redis redis-5.0.7]# make
[root@redis redis-5.0.7]# make PREFIX=/usr/local/redis install
[root@redis redis-5.0.7]# cd /opt/redis-5.0.7/utils/
[root@redis utils]# ./install_server.sh
make
 make PREFIX=/usr/local/redis install
 命令显示结果如下:

类似redis缓存中间件_redis

./install_server.sh
 命令显示结果如图:
 
内容代码注释:
instance:实例
Port:端口
Config file:配置文件路径
Log file:日志文件路径
Data dir:数据文件路径
Executable:可执行文件路径
Cli Executable:客户端命令文件
##当install_server.sh脚本执行完成,同时Redis服务也启动成功

类似redis缓存中间件_redis_02


然后继续进行操作:

[root@redis utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/ 
#把Redis的执行文件放到环境变量目录下便于系统识别,Redis服务控制
/etc/init.d/redis_6379 stop #停止服务
/etc/init.d/redis_6379 start #开启服务
/etc/init.d/redis_6379 restart #重启服务
/etc/init.d/redis_6379 status #查看服务


[root@redis utils]# netstat -natp | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      22919/redis-server  
[root@redis utils]# vim /etc/redis/6379.conf 

#70行 bind 127.0.0.1 192.168.152.130 #添加监听的主机地址
#93行 port 6379 #默认服务端口
#137行 daemonize yes #启动守护进程
#159行 pidfile /var/run/redis_6379.pid #指定pid文件
#167行 loglevel notice #日志文件级别
#172行 logfile /var/log/redis_6379.log #指定日志文件

[root@redis utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@redis utils]#  netstat -natp | grep redis
tcp        0      0 192.168.152.130:6379    0.0.0.0:*               LISTEN      23423/redis-server  
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      23423/redis-server  
[root@redis utils]#

6. redis命令工具

redis-server:用于启动Redis的工具
redis-benchmark:用于检测Redis在本机的运行效率
redis-check-aof:修复AOF持久化文件
redis-check-rdb:修复RDB持久化文件
redis-cli:Redis命令行工具
redis-cli -h 远程主机ip -p 服务端口号 -a 指定密码
如果没有设置数据库密码,可以省略-a选项,若不添加任何选项表示,这使用127.0.0.1:6379连接本机上的Redis数据库

#redis-server:用于启动Redis的工具
格式:redis-cli -h host -p port -a password
-h :指定远程主机
-p :指定Redis服务的端口号
-a :指定密码,未设置数据库密码可以省略-a选项
ps:若不添加任何选项表示,则使用127.0.0.1: 6379连接本机上的 Redis数据库

例:
[root@redis utils]#  redis-cli -h 192.168.152.130 -p 6379
192.168.152.130:6379> 
192.168.152.130:6379> 
192.168.152.130:6379> exit
[root@redis utils]#

7. redis测试工具 redis-benckmark

redis-benchmark 选项:
-h :指定服务器主机名
-P :指定服务器端口
-s :指定服务器socket(套接字)
-c :指定并发连接数
-n :指定请求数
-d :以字节的形式指定SET/GET值的数据大小
-k :1=keep alive 0=reconnect
-r :SET/GET/INCR 使用随机key,SADD使用随机值
-p :通过管道传输<numreq>请求
-q :强制退出redis
-l :生成循环,永久执行测试
-t :仅运行以逗号分割的测试命令列表
-I :Idle模式,仅打开N哥idle连接并等待


例如:
[root@redis utils]# redis-benchmark -h 192.168.152.130 -P 6379 -c 100 -n 10000
#向主机发送100哥并发连接和10000哥请求测试性能

[root@redis utils]# redis-benchmark -h 192.168.152.130 -p 6379 -q -d 10
#测试存取10字节的数据包性能

[root@localhost utils]# redis-benchmark -t set,lpush -n 100000 -q
#测试本机Redis服务在进行set和lpush操作时的性能

8. Redis数据库常用命令(数据库内部操作)

8.1 存放和获取数据

格式:
set:存放数据,命令格式为set key value
get:获取数据,命令格式为get key

例如:
[root@redis ~]#  redis-cli -h 192.168.152.130 -p 6379
192.168.152.130:6379> keys *
1) "counter:__rand_int__"
2) "myset:__rand_int__"
3) "key:__rand_int__"
4) "mylist"
192.168.152.130:6379> set a 1 #设置a键的值为1
OK
192.168.152.130:6379> set a1 1
OK
192.168.152.130:6379> set b 2
OK
192.168.152.130:6379> keys * #查看所有的键
1) "counter:__rand_int__"
2) "b"
3) "a"
4) "myset:__rand_int__"
5) "key:__rand_int__"
6) "a1"
7) "mylist"
192.168.152.130:6379> get a #获取a的值
"1"
192.168.152.130:6379> get b
"2"
192.168.152.130:6379> keys a* #获取以a开头
1) "a"
2) "a1"
192.168.152.130:6379> keys a? #获取以a开头,包含任意一位的键
1) "a1"

8.2 重命名

rename 源key 目标key    无论目标key是否存在都会进行重命名并覆盖
renamenx 源key 目标key  目标key存在则取消重命名

例如:
192.168.152.130:6379> rename b b1
OK
192.168.152.130:6379> get b
(nil)
192.168.152.130:6379> get b1
"2"
192.168.152.130:6379> keys *
1) "b1"
2) "counter:__rand_int__"
3) "a"
4) "myset:__rand_int__"
5) "key:__rand_int__"
6) "a1"
7) "mylist"
192.168.152.130:6379> renamenx b1 a1
(integer) 0
192.168.152.130:6379> get b1
"2"
192.168.152.130:6379> get a1
"1"
192.168.152.130:6379>

8.3 判断键值是否存在,键值类型,删除键

192.168.152.130:6379> exists a
(integer) 1  #1表示存在
192.168.152.130:6379> exists b
(integer) 0  #0表示不存在
192.168.152.130:6379> type a
string  #查看类型
192.168.152.130:6379> del a1 #删除键
(integer) 1
192.168.152.130:6379> keys *
1) "b1"
2) "counter:__rand_int__"
3) "a"
4) "myset:__rand_int__"
5) "key:__rand_int__"
6) "mylist"
192.168.152.130:6379> get a1 #也同时获不到a1的值
(nil)

8.4 查看当前数据库的key的数目

192.168.152.130:6379> dbsize
(integer) 7
192.168.152.130:6379> keys *
1) "b1"
2) "counter:__rand_int__"
3) "a"
4) "myset:__rand_int__"
5) "key:__rand_int__"
6) "a1"
7) "mylist"
192.168.152.130:6379>

8.5 redis 设置密码

#设置及删除密码
例如:
192.168.152.130:6379> config set requirepass 123 # 远程登录的是不可以设置密码的
(error) ERR unknown command `config`, with args beginning with: `set`, `requirepass`, `123`, 
192.168.152.130:6379> exit
[root@redis ~]# redis-cli # 切换为本地登录
127.0.0.1:6379> 
127.0.0.1:6379> config set requirepass 123 #设置密码
OK
127.0.0.1:6379> config get requirepass #设置密码后,如果不进行密码验证无法进行任何操作
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123 #密码认证
OK
127.0.0.1:6379> config get requirepass #查看密码
1) "requirepass"
2) "123"
127.0.0.1:6379> config set requirepass '' #删除密码
OK

ps:
设置密码后,Redis无法重启服务;远程登录无法正产登入

9. Redis多数据库常用命令

Redis支持多数据库,Redis 默认情况下包含16个数据库,数据库名称是用数字0-15来依次命名的。
多数据库相互独立,互不干扰

9.1 多数据库间的切换

使用redis-cli连接Redis数据库后,默认使用的序号位0的数据库

格式:
select 10		##切换至序号位10的数据库
select 15		##切换至序号位15的数据库

[root@redis ~]# redis-cli
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "b1"
2) "counter:__rand_int__"
3) "a"
4) "myset:__rand_int__"
5) "key:__rand_int__"
6) "mylist"
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]> keys *
(empty list or set)
127.0.0.1:6379[15]> select 16
(error) ERR DB index is out of range
127.0.0.1:6379[15]>

9.2 多数据库间移动数据

格式:
格式 move 键值 数据库序号

例如:
127.0.0.1:6379[15]> select 1
OK
127.0.0.1:6379[1]> keys * #里面无数据
(empty list or set)
127.0.0.1:6379[1]> select 0 #切换数据库
OK
127.0.0.1:6379> keys *
1) "b1"
2) "counter:__rand_int__"
3) "a"
4) "myset:__rand_int__"
5) "key:__rand_int__"
6) "mylist"
127.0.0.1:6379> move a 1 #移动到1
(integer) 1
127.0.0.1:6379> select 1 #切换到1
OK
127.0.0.1:6379[1]> keys * #查看键
1) "a"
127.0.0.1:6379[1]>

9.3 清除数据库内数据

127.0.0.1:6379[1]> flushdb  #清空当前数据库数据
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "b1"
2) "counter:__rand_int__"
3) "myset:__rand_int__"
4) "key:__rand_int__"
5) "mylist"
127.0.0.1:6379> flushall  #清空所有库数据,慎用
OK
127.0.0.1:6379> keys *
(empty list or set)



小tips:
redis 远程数据备份(全量、增量)
是以Shell脚本的形式

redis backup. sh
	#! /bin/bash
	TIME=$
	BCDIR=
	redis server=
	post
	psword

10. redis的数据类型

10.1 String类型

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M

10.1.1 SET/GET/APPEND/STRLEN

127.0.0.1:6379> keys * #查看当前数据库所有键
(empty list or set)
127.0.0.1:6379> exists a #判断键值是否存在
(integer) 0
127.0.0.1:6379> append a "hello" #不存在,则相当于创建
(integer) 5
127.0.0.1:6379> get a
"hello"
127.0.0.1:6379> append a "world" #存在,则追加
(integer) 10
127.0.0.1:6379> get a
"helloworld"
127.0.0.1:6379> set a "hh" #覆盖操作
OK
127.0.0.1:6379> get a
"hh"
127.0.0.1:6379> strlen a #获取指定key的字符长度
(integer) 2
127.0.0.1:6379>

10.1.2 INCR/ DECR/ I NCRBY/ DECRBY

127.0.0.1:6379> keys *
1) "a"
127.0.0.1:6379> exists b #自增1,从0开始(key值必须位整数)
(integer) 0
127.0.0.1:6379> incr b
(integer) 1
127.0.0.1:6379> incr b
(integer) 2
127.0.0.1:6379> incr b
(integer) 3
127.0.0.1:6379> decr b #自减1
(integer) 2
127.0.0.1:6379> decr b
(integer) 1
127.0.0.1:6379> decr b
(integer) 0
127.0.0.1:6379> decr b
(integer) -1
127.0.0.1:6379> incrby b 10 #增加指定的整数
(integer) 9
127.0.0.1:6379> decrby b 10 #减少指定的整数
(integer) -1
127.0.0.1:6379>

10.1.3 GETSET

127.0.0.1:6379> set c 1 #设定新键值
OK
127.0.0.1:6379> getset c 2 #对存在的键值获取,然后赋值
"1"
127.0.0.1:6379> get c #获取到值
"2"
127.0.0.1:6379> getset d 1 #不存在的键先获取为空,然后赋值
(nil)
127.0.0.1:6379> get d
"1"
127.0.0.1:6379>

10.1.4 SETEX

格式:
setex  key  seconds  value
设置指定key的过期时间为seconds

例如:
127.0.0.1:6379> set k1 test  #设定新键值
OK
127.0.0.1:6379> setex k11 10 test   #设置k11的过期时间为10s
OK
127.0.0.1:6379> ttl k11
(integer) 5
127.0.0.1:6379> ttl k11    #-2表示已经过期
(integer) -2
127.0.0.1:6379> ttl k1    #-1表示永不过期
(integer) -1

10.1.5 SETNX

格式:
setnx key value: 不存在键的话执行set操作返回值1,存在的话不执行修改,返回值0

127.0.0.1:6379> del k1  #删除前面的键
(integer) 0
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> setnx k1 1  # k1不存在则创建
(integer) 1
127.0.0.1:6379> setnx k1 2   # k1存在则放弃操作
(integer) 0
127.0.0.1:6379> get k1
"1"

10.1.6 MSET/MGET/MSETNX

格式:
mset key value [key value …] #批量设置键值对;m:批量
mget key [key …] #批量获取键值对
msetnx key value [key value …] 
#批量设置键值对,键都不存在就执行并返回1;只要有一个键存在就不执行并返回0

127.0.0.1:6379> mset k1 1 k2 2 k3 3  #批量设置键值
OK
127.0.0.1:6379> mget k1 k2 k3  #批量获取键值
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> msetnx k1 1 k4 4 k5 5 #因为k1存在,则失败
(integer) 0
127.0.0.1:6379> mget k1 k2 k3 k4 k5
1) "1"
2) "2"
3) "3"
4) (nil)
5) (nil)
127.0.0.1:6379> msetnx k4 4 k5 5  #k4 k5不存在,则成功
(integer) 1
127.0.0.1:6379> mget k1 k2 k3 k4 k5
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379>

10.2 List类型

在左侧插⼊数据 lpush key value1 value2
在右侧插⼊数据 rpush key value1 value2
在指定元素的前或后插⼊新元素 linsert key before或after 现有元素 新元素
获取元素 lrange key start stop

start、stop为元素的下标索引
索引从左侧开始,第⼀个元素为0
索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素

设置指定索引位置的元素值 lset key index value
索引从左侧开始,第⼀个元素为0
索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素

删除 lrem key count value
列表中前count次出现的值为value的元素移除
count > 0: 从头往尾移除
count < 0: 从尾往头移除
count = 0: 移除所有

10.2.1 LPUSH/LPUSHX/LRANGE

127.0.0.1:6379> lpush zzz a b c  #lpush由左插入多个键值,
(integer) 3
127.0.0.1:6379> lrange zzz 0 -1
#lrange查看list数据类型的key值,后面要加查看的范围
#这里0表示第一个数,-1表示最后一个数(也可以输入key值个数)
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> lrange zzz 1 2
1) "b"
2) "a"
127.0.0.1:6379> lpushx zzz d #lpushx插入一个元素在一个已存在的key的开头
(integer) 4
127.0.0.1:6379> lrange zzz 0 -1
1) "d"
2) "c"
3) "b"
4) "a"

10.2.2. LPOP/LLEN

格式:
   lpop		#移除并返回第一个元素,从头开始
   llen		#查看列表中元素个数
#在上面步骤的基础上,继续操作

127.0.0.1:6379> lpop zzz #lpop移除首个元素
"d"
127.0.0.1:6379> lrange zzz 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> llen zzz #获取key值个数
(integer) 3

10.2.3 LREM/LSET/LINDEX/LTRIM

格式:
lrem key count value:从列表头部开始删除count个值为value的元素,并返回实际删除数量
lset key index value:将位置索引为index的元素设置新值value
lindex key index:获取索引为index的元素
ltrim  key start stop:仅保留从位置索引start到索引stop的元素

127.0.0.1:6379> lpush www a b c #创建一个list
(integer) 3
127.0.0.1:6379> lrange www 0 -1 
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> lrem www 2 a 
#从头部(left)向尾部(right)变量链表,删除2个值等于a的元素,返回值为实际删除的数量
(integer) 1
127.0.0.1:6379> lrange www 0 -1
1) "c"
2) "b"
127.0.0.1:6379> lset www 1 f  #将第1个元素设置为f
OK
127.0.0.1:6379> lrange www 0 -1
1) "c"
2) "f"
127.0.0.1:6379> lindex www 0 #获取索引为0的元素
"c"
127.0.0.1:6379> ltrim www 0 1  
#仅保留索引为0到索引为1的元素,相当于保留删除
OK
127.0.0.1:6379> lrange www 0 -1
1) "c"
2) "f"
127.0.0.1:6379>

10.2.4 LINSERT

格式:
linsert		#在键的xxx元素前|后插入新元素元素 

127.0.0.1:6379> lpush hhh 1 2 3 4 #新键kl
(integer) 4
127.0.0.1:6379> linsert hhh before 1 a #在元素1前面插入a
(integer) 5
127.0.0.1:6379> lrange hhh 0 -1		##从结果看已经插入成功
1) "4"
2) "3"
3) "2"
4) "a"
5) "1"
127.0.0.1:6379> lset hhh 1 4		##修改索引1位置改为4
OK
127.0.0.1:6379> lrange hhh 0 -1		##查询已经修改成功
1) "4"
2) "4"
3) "2"
4) "a"
5) "1"
127.0.0.1:6379> linsert kl hhh 4 b	 ##在元素4后面插入元素b
(integer) 6
127.0.0.1:6379> lrange hhh 0 -1	##查询是在第一个4后面插入
1) "4"
2) "b"
3) "4"
4) "2"
5) "a"
6) "1"
127.0.0.1:6379>  linsert hhh after 8 q	
##在元素8后面插入q;元素8并不存在,linsert命令操作失败,返回-1
(integer) -1
127.0.0.1:6379> linsert hhh1 after 8 q		
##为不存在的键插入新元素,linsert命令操作失败,返回0
(integer) 0

10.2.5 BPUSH/RPUSHX/RPOP/RPOPLPUSH

格式:
rpush key value [value …] 
#在列表的尾部依次插入value;l:list
rpushx key value 
#key必须存在才可执行,将value从尾部插入,并返回所有元素数量
rpop key 
#在尾部弹出(移除)一个元素,并返回该元素
rpoplpush source destination 
#在key1的尾部弹出一个元素并返回,将它插入key2的头部

127.0.0.1:6379> rpush kl 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange kl 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> rpushx kl a		#kl键尾部插入a,并返回元素数量
(integer) 6
127.0.0.1:6379> lrange kl 0 -1		#查询插入成功
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "a"
127.0.0.1:6379> rpop kl		#移除并返回kl键的第一个元素,从右取
"a"
127.0.0.1:6379> lrange kl 0 -1	#查询最右的元素a已被移除
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> rpoplpush kl kl2	#将kl键的尾部元素弹出插入到kl2键的首部
"4"
127.0.0.1:6379> lrange kl 0 -1		#查询显示kl键尾部元素4已被弹出
1) "5"
2) "1"
3) "2"
4) "3"
127.0.0.1:6379> lrange kl2 0 -1		#查询显示kl2键首部元素4已被插入
1) "4"

10.3 Hash类型

hash用于存储对象。可以采用这样的命名方式(hash格式) :对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。
如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对

10.3.1 HSET/HGET/HDEL/HEXISTS/HLEN/HSETNX

hset			#给xxx键设置字段为xxx,值为xxx
   hget			#获取xxx键,字段为xxx的值
   hdel			#删除xxx键的xxx字段,成功返回1
   hexists		#判断xxx键中的xxx字段是否存在,存在返回1
   hlen			#获取xxx键的字段数量
   hsetnx		#给xxx键添加新字段,是否执行基于此字段是否存在,不管键是否存在,返回1表示执行成功

127.0.0.1:6379> 
127.0.0.1:6379> hset h1 field1 zhangsan  #字段为field1,值为zhangsan
(integer) 1
127.0.0.1:6379> hget h1 field1  #获取键值为h1,字段为field1的值
"zhangsan"
127.0.0.1:6379> hset h1 field2 lisi
(integer) 1
127.0.0.1:6379> hget h1 field2
"lisi"
127.0.0.1:6379> hlen h1   #获取h1的字段数量
(integer) 2
127.0.0.1:6379> hexists h1 field1  #判断h1的field1是否存在,1为存在,0为不存在
(integer) 1
127.0.0.1:6379> hdel h1 field1  #删除
(integer) 1
127.0.0.1:6379> hexists h1 field1
(integer) 0
127.0.0.1:6379> hsetnx h1 field1 zhangsan #因为不存在则设置
(integer) 1
127.0.0.1:6379> hsetnx h1 field1 zhangsan  #因为存在则不执行操作
(integer) 0
127.0.0.1:6379>

10.3.2 HINCRBY

格式:
hincrby key field increment ##指定键的字段自增/自减

127.0.0.1:6379> hset aaa field 5 #设置字段为field1的值为5
(integer) 1
127.0.0.1:6379> hincrby aaa field 5 #自增5
(integer) 10
127.0.0.1:6379> hincrby aaa field 5
(integer) 15
127.0.0.1:6379> hincrby aaa field -20 #减20
(integer) -5
127.0.0.1:6379>

10.3.3 HGETALL/HKEYS/HVALS/HMGET/HMSET

格式:
hmset key field value   #批量为xxx键创建字段和赋值
hmget key field		    #获取指定多个字段值
hgetall key		        #返回xxx键的所有字段及其值,是逐对列出的
hkeys key		        #仅获取xxx键中所有字段名
hvals key		        #仅获取xxx键中所有字段值

127.0.0.1:6379> hmset hash f1 hello f2 world  #批量设置多个字段
OK
127.0.0.1:6379> hmget hash f1 f2 f3  #批量获取多个字段
1) "hello"
2) "world"
3) (nil)
127.0.0.1:6379> hgetall hash   #获取全部字段
1) "f1"
2) "hello"
3) "f2"
4) "world"
127.0.0.1:6379> hkeys hash   #获取字段名
1) "f1"
2) "f2"
127.0.0.1:6379> hvals hash   #获取字段值
1) "hello"
2) "world"
127.0.0.1:6379>

10.4 Set类型(无序集合)

⽆序集合:元素为string类型
元素具有唯⼀性,不重复

10.4.1 SADD/SMEMBERS/SCARE/SISMEMBER

格式:
sadd				#将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略
                    #假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合
smembers			#通过smembers命令查看插入的结果,输出的顺序与插入顺序无关
scard			    #获取集合中成员的数量
sismember		    #判断键中xxx成员是否存在,返回0表示不存在,1表示存在

127.0.0.1:6379> sadd aaa 1 2 3 4		##添加aaa键的元素1234
(integer) 4
127.0.0.1:6379> sadd aaa 1 3 5 6		## 添加aaa键的元素1356,返回值为2,因为13已存在,不会重复添加
(integer) 2
127.0.0.1:6379> smembers aaa		##查看指定aaa键的成员
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> sismember aaa 1		##查询aaa键的元素1,存在返回1
(integer) 1
127.0.0.1:6379> sismember aaa 11		##查询aaa键的元素11,不存在返回0
(integer) 0
127.0.0.1:6379> scard aaa		##查看aaa键的元素个数
(integer) 6

10.4.2 SPOP/SREM/SRANDMEMBER/SMOVE

格式:
spop				#随机的移除并返回键中的某一成员
srem				#从键中移出xxx、xxx、xxx成员,并返回移出成员个数
srandmember		    #该命令随机的返回某一成员
smove 			    #将键1的xxx成员移到键2,成功返回1,失败返回0

127.0.0.1:6379> sadd aaa a b c d  #插入数据
(integer) 4
127.0.0.1:6379> smembers aaa   #查看数据
1) "a"
2) "c"
3) "d"
4) "b"
127.0.0.1:6379> srandember aaa  #随机返回一个元素
"a"
127.0.0.1:6379> srandember aaa
"a"
127.0.0.1:6379> srandember aaa
"d"
127.0.0.1:6379> spop aaa        #随机删除一个元素
"d"
127.0.0.1:6379> smembers aaa
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> srem aaa a b f   #移除三个元素,f不存在,则成功两个
(integer) 2
127.0.0.1:6379> smembers aaa
1) "c"
127.0.0.1:6379> smove aaa aaa2 c  #将aaa里的c移到aaa2
(integer) 1
127.0.0.1:6379> smove aaa aaa2 c   #aaa中无c
(integer) 0
127.0.0.1:6379> smembers aaa2
1) "c"

10.5 Sorted Set类型(有序集合)

有序集合,元素类型为Sting, 元素具有唯一 性,不能重复。
每个元素都会关联一个double类型的分数score(表示权重),可以通过权重的大小排序,元素的score可以相同。

10.5.1 ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK

zadd		#将一个或多个成员元素及其分数值加入到有序集当中
zcard		#获取键中成员的数量
zcount		#分数满足表达式x <= score <= x的成员的数量
zrem		#删除成员xxx、xxx,返回实际删除成员的数量
zincrby	 	#成员xxx不存在,zincrby命令将添加该成员并假设其初始分数为0
zscore		#获取成员xxx的分数
zrank		#获取成员xxx的位置索引值

127.0.0.1:6379> zadd k1 1 zhangsan #添加kl键的zhangsan的分数为1
(integer) 1
127.0.0.1:6379> zadd k1 2 lisi 3 wangwu #可以批量添加
(integer) 2
127.0.0.1:6379> zrange k1 0 -1 #查询kl键的成员
1) "zhangsan"
2) "lisi"
3) "wangwu"
127.0.0.1:6379> zrange k1 0 -1 withscores #查询kl键的成员和分数
1) "zhangsan"
2) "1"
3) "lisi"
4) "2"
5) "wangwu"
6) "3"
127.0.0.1:6379> zrank k1 zhangsan #返回kl键zhazngsan成员的索引
(integer) 0
127.0.0.1:6379> zcard k1 #返回kl键的成员数量
(integer) 3
127.0.0.1:6379> zcount k1 1 3 #返回kl键的分数符合1≤score≥3的成员数量
(integer) 3
127.0.0.1:6379> zrem k1 1 zhangsan 2 lisi #指定删除2个成员,2存在,返回实际删除的数量1
(integer) 2
127.0.0.1:6379> zscore k1 lisi #查看指定成员的分数,因为之前把它删掉了,所以查询不到
(nil)
127.0.0.1:6379>

10.5.2 ZRANGE BY SCORE/ZREM RANGE BYRANK/ZREM RANGE BY SCORE

格式:
zrangebyscore		 #获取分数满足表达式 x <= score <= x 的成员
zremrangebyrank		 #删除位置索引满足表达式 x <= rank <= x 的成员
zremrrangebyscore	 #删除分数满足表达式 x <= score <= x 的成员,并返回实际删除的数量

127.0.0.1:6379> zadd k2 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zrangebyscore k2 2 3 #显示第三个到四个元素
1) "b"
2) "c"
127.0.0.1:6379> zrangebyscore k2 -inf +inf limit 2 2  #第三个元素开始的后两个
1) "c"
2) "d"
127.0.0.1:6379> zrangebyscore k2 -inf +inf limit 1 1
1) "b"
127.0.0.1:6379> zrangebyscore k2 -inf +inf limit 3 2
1) "d"
2) "e"
127.0.0.1:6379> zremrangebyrank k2 1 3  #删除第二个到四个元素
(integer) 3
127.0.0.1:6379> zrange k2 0 -1
1) "a"
2) "e"

10.5.3 ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK

格式:
zrevrange			    #以位置索引从高到低的方式获取并返回此区间内的成员
zrevrangebyscore		#获取分数满足表达式x >= score >= x 的成员,并以从高到底的顺序输出。
zrevrank	 			#获取成员索引


127.0.0.1:6379> zadd k2 1 a 2 b 3 c 4 d 5 e
(integer) 5
127.0.0.1:6379> zrevrange k2 0 -1   #倒序查看
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> zrevrank k2 b  #获取元素的位置索引
(integer) 3
127.0.0.1:6379> zrevrangebyscore k2 4 2  # 倒序
1) "d"
2) "c"
3) "b"
127.0.0.1:6379> zrevrangebyscore k2 3  1 limit 1 2
1) "b"
2) "a"