Redis学习笔记
文章目录
1、安装
以商城项目为例,不同部分所用数据库不同
# 商品信息
- 一般存放在关系型数据库:Mysql,阿里巴巴使用的Mysql都是经过内部改动的。
# 商品描述、评论(文字居多)
- 文档型数据库:MongoDB
# 图片
- 分布式文件系统 FastDFS
- 淘宝:TFS
- Google: GFS
- Hadoop: HDFS
- 阿里云: oss
# 商品关键字 用于搜索
- 搜索引擎:solr,elasticsearch
- 阿里:Isearch 多隆
# 商品热门的波段信息
- 内存数据库:Redis,Memcache
# 商品交易,外部支付接口
- 第三方应用
Redis(Remote Dictionary Server ),即远程字典服务。
官网下载:https://redis.io/
把安装包 redis-5.0.8.tar.gz
放到 /opt
目录下
执行解压命令 tar zxvf redis-6.2.2.tar.gz
解压到/opt文件夹下,得到redis-6.2.2
2、启动
配置
安装 gcc
yum install gcc-c++
# 然后进入redis目录下执行,一定要在redis-6.2.2文件夹下面执行make命令,否则报错!
make
# 然后执行
make install
redis默认安装路径 /usr/local/bin
,在该目录下新建ljhconfig,执行mkdir ljhconfig
将redis的配置文件复制到程序安装目录 /usr/local/bin/ljhconfig
下 ,此时在/user/local/bin
目录下输入下面的命令行:
cp /opt/redis-6.2.2/redis.conf ljhconfig
redis默认不是后台启动的,需要修改配置文件!在 /usr/local/bin/ljhconfig
目录下执行vim redis.config
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WsNVcRsv-1646209457682)(…/…/AppData/Roaming/Typora/typora-user-images/1619319923839.png)]
启动redis
通过指定的配置文件启动redis服务
在/usr/local/bin/ljhconfig
目录输入命令
[root@iZ8vb5nl4hbc7syh6jmdz8Z ljhconfig]# redis-server redis.conf
使用redis-cli连接指定的端口号测试,Redis的默认端口6379
[root@iZ8vb5nl4hbc7syh6jmdz8Z ljhconfig]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name ljh
OK
127.0.0.1:6379> get name
"ljh"
查看redis进程是否开启
[root@iZ8vb5nl4hbc7syh6jmdz8Z ljhconfig]# ps -ef|grep redis
root 8676 1 0 11:09 ? 00:00:00 redis-server 127.0.0.1:6379
root 16395 19026 0 11:13 pts/0 00:00:00 grep --color=auto redis
关闭Redis服务 shutdown
[root@iZ8vb5nl4hbc7syh6jmdz8Z ljhconfig]# redis-cli -p 6379
127.0.0.1:6379> shutdown
not connected> exit
再次查看进程是否存在
[root@iZ8vb5nl4hbc7syh6jmdz8Z ljhconfig]# ps -ef|grep redis
root 6522 1251 0 11:25 pts/0 00:00:00 grep --color=auto redis
redis性能测试redis-benchmark
# 测试100并发数,100000请求
[root@iZ8vb5nl4hbc7syh6jmdz8Z bin]# redis-benchmark -c 100 -n 100000
====== PING_INLINE ======
100000 requests completed in 1.46 seconds
100 parallel clients
3 bytes payload #每次写入3个字节
keep alive: 1 #只有一台服务器处理
host configuration "save": 3600 1 300 100 60 10000
host configuration "appendonly": no
multi-thread: no
Latency by percentile distribution:
0.000% <= 0.279 milliseconds (cumulative count 1)
50.000% <= 0.887 milliseconds (cumulative count 50753)
75.000% <= 1.191 milliseconds (cumulative count 75072)
87.500% <= 1.479 milliseconds (cumulative count 87508)
93.750% <= 1.743 milliseconds (cumulative count 93798)
96.875% <= 2.015 milliseconds (cumulative count 96898)
98.438% <= 2.367 milliseconds (cumulative count 98452)
99.219% <= 2.927 milliseconds (cumulative count 99226)
99.609% <= 3.631 milliseconds (cumulative count 99610)
99.805% <= 4.423 milliseconds (cumulative count 99805)
99.902% <= 5.559 milliseconds (cumulative count 99903)
99.951% <= 6.255 milliseconds (cumulative count 99952)
99.976% <= 6.527 milliseconds (cumulative count 99976)
99.988% <= 6.671 milliseconds (cumulative count 99988)
99.994% <= 6.759 milliseconds (cumulative count 99994)
99.997% <= 6.799 milliseconds (cumulative count 99997)
99.998% <= 6.823 milliseconds (cumulative count 99999)
99.999% <= 6.847 milliseconds (cumulative count 100000)
100.000% <= 6.847 milliseconds (cumulative count 100000)
。。。
redis 性能测试工具可选参数如下所示:
序号 | 选项 | 描述 | 默认值 |
---|---|---|---|
1 | -h | 指定服务器主机名 | 127.0.0.1 |
2 | -p | 指定服务器端口 | 6379 |
3 | -s | 指定服务器 socket | |
4 | -c | 指定并发连接数 | 50 |
5 | -n | 指定请求数 | 10000 |
6 | -d | 以字节的形式指定 SET/GET 值的数据大小 | 3 |
7 | -k | 1=keep alive 0=reconnect | 1 |
8 | -r | SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
9 | -P | 通过管道传输 请求 | 1 |
10 | -q | 强制退出 redis。仅显示 query/sec 值 | |
11 | –csv | 以 CSV 格式输出 | |
12 | -l | 生成循环,永久执行测试 | |
13 | -t | 仅运行以逗号分隔的测试命令列表。 | |
14 | -I | Idle 模式。仅打开 N 个 idle 连接并等待。 |
3、基本命令
Redis命令中心:http://www.redis.cn/commands.html
数据库相关
redis默认有16个数据库 ,默认使用第0个
keys *
:查看当前数据库中所有的key。
flushdb
:清空当前数据库中的键值对。
flushall
:清空所有数据库的键值对。
[root@iZ8vb5nl4hbc7syh6jmdz8Z ljhconfig]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> config get databases
1) "databases"
2) "16"
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> DBSIZE
(integer) 0
127.0.0.1:6379[3]> set name ljh
OK
127.0.0.1:6379[3]> DBSIZE
(integer) 1
127.0.0.1:6379[3]> keys *
1) "name"
127.0.0.1:6379[3]> FLUSHDB
OK
127.0.0.1:6379[3]> keys *
(empty array)
127.0.0.1:6379[3]> SELECT 0
OK
Redis为什么单线程还这么快?
核心:Redis是将所有的数据放在内存中的,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文会切换:耗时的操作!),对于内存系统来说,如果没有上下文切换效率就是最高的,多次读写都是在一个CPU上的,在内存存储数据情况下,单线程就是最佳的方案。
Redis-key
exists key
:判断键是否存在del key
:删除键值对move key db
:将键值对移动到指定数据库expire key second
:设置键值对的过期时间type key
:查看value的数据类型
127.0.0.1:6379> move name 2 # 把name移动到2号数据库,也就是第三个数据库
(integer) 1
127.0.0.1:6379> keys *
1) "hh"
2) "age"
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]> keys *
1) "name"
127.0.0.1:6379[2]> del name #删除name
(integer) 1
127.0.0.1:6379[2]> keys *
(empty array)
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> keys *
1) "hh"
2) "age"
127.0.0.1:6379> set name ljh
OK
127.0.0.1:6379> EXPIRE name 10 #name10秒后过期,自动删除
(integer) 1
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> TTL name #ttl key ,判断还有几秒过期,-2为已过期
(integer) -2
127.0.0.1:6379> EXISTS name
(integer) 0
127.0.0.1:6379> keys *
1) "hh"
2) "age"
127.0.0.1:6379> type age # 查看age的类型
string
Redis的key,通过TTL命令返回key的过期时间,一般来说有3种:
- 当前key没有设置过期时间,所以会返回-1.
- 当前key有设置过期时间,而且key已经过期,所以会返回-2.
- 当前key有设置过期时间,且key还没有过期,故会返回key的正常剩余时间.
重命名RENAME
和RENAMENX
RENAME key newkey
修改 key 的名称RENAMENX key newkey
仅当 newkey 不存在时,将 key 改名为 newkey 。
4、五大数据类型
4.1、String(字符串)
append
如果 key
已经存在,并且值为字符串,那么这个命令会把 value
追加到原来值(value)的结尾。 如果 key
不存在,那么它将首先创建一个空字符串的key
,再执行追加操作,这种情况 append将类似于 set操作。
127.0.0.1:6379> set name ljh
OK
127.0.0.1:6379> APPEND name hello
(integer) 8
127.0.0.1:6379> get name
"ljhhello"
127.0.0.1:6379> APPEND name 12
(integer) 10 #返回append后字符串值(value)的长度
127.0.0.1:6379> get name
"ljhhello12"
127.0.0.1:6379> APPEND hhh lkjh #key不存在,相当于set
(integer) 4
127.0.0.1:6379> get hhh
"lkjh"
incr/decr: 将指定key的value数值进行+1/-1(仅对于数字)
INCRBY/DECRBY key n
: 按指定的步长对数值进行加减
INCRBYFLOAT age n
:为age数值添加浮点数
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> INCR age #+1
(integer) 19
127.0.0.1:6379> INCR age
(integer) 20
127.0.0.1:6379> DECR age #-1
(integer) 19
127.0.0.1:6379> INCRBY age 5 #按步长5增加,+5
(integer) 24
127.0.0.1:6379> DECRBY age 2 #按步长2减少,-2
(integer) 22
127.0.0.1:6379> INCRBYFLOAT age 2.4 #为数值加上浮点型数值
"24.4"
strlen: 获取key保存值的字符串长度
127.0.0.1:6379> keys *
1) "age"
2) "name"
3) "hhh"
127.0.0.1:6379> STRLEN name
(integer) 10
127.0.0.1:6379> get name
"ljhhello12"
getrange: 按起止位置获取字符串(闭区间,起止位置都取) 从0开始
GETRANGE key start end
127.0.0.1:6379> get name
"ljhhello12"
127.0.0.1:6379> GETRANGE name 0 4
"ljhhe"
127.0.0.1:6379> GETRANGE name 0 -1 #表示获取name的全部value,相当于直接get
"ljhhello12"
setrange key offset value:用指定的value 替换key中 offset开始的值
127.0.0.1:6379> get name
"ljhhello12"
127.0.0.1:6379> SETRANGE name 3 lll #把下标为3的h往后的3个元素改为lll
(integer) 10
127.0.0.1:6379> get name
"ljhllllo12"
getset key value
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
127.0.0.1:6379> get name
"ljhllllo12"
127.0.0.1:6379> GETSET name kkkkkjjj
"ljhllllo12"
127.0.0.1:6379> get name
"kkkkkjjj"
setnx:仅当key不存在时进行set
将key
设置值为value
,如果key
不存在,这种情况下等同set命令。 当key
存在时,什么也不做。SETNX
是”SET if Not eXists”的简写。
返回值:
1
:key被设置了0
:key没有被设置
127.0.0.1:6379> get name
"kkkkkjjj"
127.0.0.1:6379> SETNX name ljhkk
(integer) 0
127.0.0.1:6379> get name
"kkkkkjjj"
setex key seconds value
设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期。这个命令等效于执行下面的命令:
SET mykey value
EXPIRE mykey seconds
127.0.0.1:6379> get name
"lkjhg"
127.0.0.1:6379> SETEX name 10 ljh
OK
127.0.0.1:6379> get name
"ljh"
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)
mset/mget key1 value1 [key2 value2…]: 批量set/get键值对
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> MGET k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379>
msetnx key1 value1 [key2 value2…]: 批量设置键值对,仅当参数中所有的key都不存在时执行
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k2"
127.0.0.1:6379> MSETNX k1 v1 k4 v4 #存在k1,不执行,原子性,只要有一个存在就不执行
(integer) 0
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k2"
127.0.0.1:6379> MSETNX k4 v4 k5 v5 #添加k4和k5
(integer) 1
127.0.0.1:6379> keys *
1) "k3"
2) "k4"
3) "k2"
4) "k1"
5) "k5"
4.2、List(列表)
命令行一般是lxxx或者rxxx,即以l
或者r
开头,值可以重复
lpush/rpush: 从左边/右边向列表中PUSH值(一个或者多个)
127.0.0.1:6379> LPUSH list list1 list2 list3
(integer) 3
127.0.0.1:6379> LRANGE list 0 -1
1) "list3"
2) "list2"
3) "list1"
127.0.0.1:6379> rpush list rl1 rl2
(integer) 5
127.0.0.1:6379> LRANGE list 0 -1
1) "list3"
2) "list2"
3) "list1"
4) "rl1"
5) "rl2"
lrange key start stop
表示列表key返回下标在start到stop的值,下标从0开始,也可以为负数,当为-1时代表最后一个值。
linsert key before/after pivot element:在列表key的pivot值前面或后面添加值element
127.0.0.1:6379> LRANGE list 0 -1
1) "list3"
2) "list2"
3) "list1"
4) "rl1"
5) "rl2"
127.0.0.1:6379> LINSERT list before rl1 hello #在rl1前面插入hello
(integer) 6
127.0.0.1:6379> LRANGE list 0 -1
1) "list3"
2) "list2"
3) "list1"
4) "hello"
5) "rl1"
6) "rl2"
127.0.0.1:6379> LINSERT list after rl1 world #在rl1后面插入world
(integer) 7
127.0.0.1:6379> LRANGE list 0 -1
1) "list3"
2) "list2"
3) "list1"
4) "hello"
5) "rl1"
6) "world"
7) "rl2"
llen:查看列表长度
127.0.0.1:6379> LLEN list #查看列表长度
(integer) 7
lindex:查看列表索引对应的值
127.0.0.1:6379> LINDEX list 0 # 查看列表下标为0的值
"list3"
127.0.0.1:6379> LINDEX list 2
"list1"
lset: 通过索引为元素设值,更新原先索引的值
127.0.0.1:6379> lset list 0 kkk
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "kkk" #原先值为list3
2) "list2"
3) "list1"
4) "hello"
5) "rl1"
6) "world"
7) "rl2"
lpop/rpop:从列表的左边/右边删除一个值,并返回被删除的值
127.0.0.1:6379> LRANGE list 0 -1
1) "kkk"
2) "list2"
3) "list1"
4) "hello"
5) "rl1"
6) "world"
7) "rl2"
127.0.0.1:6379> LPOP list #从最上方删除
"kkk"
127.0.0.1:6379> LPOP list
"list2"
127.0.0.1:6379> RPOP list #从最下面删除
"rl2"
127.0.0.1:6379> LRANGE list 0 -1
1) "list1"
2) "hello"
3) "rl1"
4) "world"
rpoplpush: 将列表的尾部(右)最后一个值弹出,并返回,然后加到另一个列表的头部
rpoplpush source destination:rpoplpush 列表 目标列表
127.0.0.1:6379> LRANGE list 0 -1
1) "list1"
2) "hello"
3) "rl1"
4) "world"
127.0.0.1:6379> RPOPLPUSH list mylist
"world"
127.0.0.1:6379> LRANGE list 0 -1
1) "list1"
2) "hello"
3) "rl1"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "world"
ltrim: 通过下标截取指定范围内的列表
LTRIM key start end
127.0.0.1:6379> LRANGE list 0 -1
1) "list1"
2) "hello"
3) "rl1"
127.0.0.1:6379> LTRIM list 0 1 #截取下标为0和1的列表
OK
127.0.0.1:6379> LRANGE list 0 -1
1) "list1"
2) "hello"
lrem:删除列表中值为value的count个元素
LREM key count value : 从存于 key 的列表里移除前 count 次出现的值为 value 的元素。
这个 count 参数通过下面几种方式影响这个操作:
- count > 0: 从头往尾移除值为 value 的元素。
- count < 0: 从尾往头移除值为 value 的元素。
- count = 0: 移除所有值为 value 的元素。
127.0.0.1:6379> LRANGE list 0 -1
1) "hello"
2) "list1"
3) "hello"
127.0.0.1:6379> LREM list 2 hello #删除列表中的两个hello
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1
1) "list1"
4.3、set(集合)
set为无序不重复集合,命令行以 s
开头
sadd:向set集合中添加一个或多个值
sadd key value[value2,…]
SCARD key
获取集合的成员数
SMEMBERS key
返回集合中所有的成员
SISMEMBER key member
查询member元素是否是集合的成员
127.0.0.1:6379> SADD myset m1 m2 m3 #添加3个值
(integer) 3
127.0.0.1:6379> SCARD myset #查看集合中有几个值
(integer) 3
127.0.0.1:6379> SMEMBERS myset #查看集合中的值
1) "m1"
2) "m3"
3) "m2"
127.0.0.1:6379> SISMEMBER myset m1 #m1是否是集合中的值
(integer) 1
127.0.0.1:6379> SISMEMBER myset m4 #m4是否是集合中的值
(integer) 0
srandmember:随机返回集合中的一个或多个值
SRANDMEMBER key [count]
随机返回集合中count个成员,count默认值为1,可选
127.0.0.1:6379> SRANDMEMBER myset #随机返回集合中的一个值
"m1"
127.0.0.1:6379> SRANDMEMBER myset
"m2"
127.0.0.1:6379> SRANDMEMBER myset
"m3"
127.0.0.1:6379> SRANDMEMBER myset
"m3"
127.0.0.1:6379> SRANDMEMBER myset 2 #随机返回集合中的两个值
1) "m3"
2) "m2"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "m1"
2) "m2"
spop:随机删除集合中的一个或多个值
SPOP key [count]
随机移除并返回集合中count个成员,count默认值为1
127.0.0.1:6379> spop myset #随机删除集合中的一个值
"m5"
127.0.0.1:6379> spop myset 2 #随机删除集合中的两个值
1) "m2"
2) "m1"
smove:移动一个集合的元素到另一个集合
SMOVE source destination member
将source集合的成员member移动到destination集合
127.0.0.1:6379> sadd myset1 m1 m2
(integer) 2
127.0.0.1:6379> sadd myset2 m3
(integer) 1
127.0.0.1:6379> smove myset1 myset2 m1 #把myset1中的m1移动到myset2
(integer) 1
127.0.0.1:6379> SMEMBERS myset1
1) "m2"
127.0.0.1:6379> SMEMBERS myset2
1) "m1"
2) "m3"
srem:移除集合中一个或多个对应的成员
SREM key member1[member2..]
移除集合中一个/多个成员
127.0.0.1:6379> SMEMBERS myset
1) "m1"
2) "m3"
3) "m4"
4) "m2"
5) "m5"
127.0.0.1:6379> SREM myset m2 #移除集合中的m2
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "m3"
2) "m4"
3) "m1"
4) "m5"
127.0.0.1:6379> SREM myset m3 m4 #移除集合中的m3和m4
(integer) 2
127.0.0.1:6379> SMEMBERS myset
1) "m1"
2) "m5"
sdiff(差集)、sinter(交集)、sunion(并集)
SDIFF key1[key2..]
返回所有集合的差集 key1- key2 - …SINTER key1 [key2..]
返回所有集合的交集SUNION key1 [key2..]
返回所有集合的并集
127.0.0.1:6379> sadd myset1 a b c
(integer) 3
127.0.0.1:6379> sadd myset2 c d e
(integer) 3
127.0.0.1:6379> SDIFF myset1 myset2 #myset1-myset2差集
1) "a"
2) "b"
127.0.0.1:6379> SDIFF myset2 myset1 #myset2-myset1差集
1) "d"
2) "e"
127.0.0.1:6379> SINTER myset1 myset2 #交集
1) "c"
127.0.0.1:6379> SUNION myset1 myset2 #并集
1) "e"
2) "b"
3) "c"
4) "a"
5) "d"
4.4、hash(哈希)
以 h
开头,key-value,适合存储对象
hset/hget:设置值/读取值
HSET key field1 value1 [field2 value2..]
同时将多个 field-value (域-值)对设置到哈希表 key 中
hmset和hset效果一样,但官方推荐使用hset
HGET key field value
获取存储在哈希表中指定字段的值
HMGET key field1 [field2..]
获取所有给定字段的值
HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。
127.0.0.1:6379> HSET myhash f1 v1 f2 v2 #设置值
(integer) 2
127.0.0.1:6379> HGET myhash f1 #读取一个值
"v1"
127.0.0.1:6379> HMGET myhash f1 f2 #读取多个值
1) "v1"
2) "v2"
127.0.0.1:6379> HEXISTS myhash f1 #f1是否存在
(integer) 1
127.0.0.1:6379> HEXISTS myhash f4 #f4是否存在
(integer) 0
hsetnx: 只有在字段 field 不存在时,设置哈希表字段的值。
HSETNX key field value
127.0.0.1:6379> HSETNX myhash f1 bb f3 v3 #插入已有的值,会报错
(error) ERR wrong number of arguments for 'hsetnx' command
127.0.0.1:6379> HSETNX myhash f3 v3 #插入不存在的值
(integer) 1
hgetall key: 获取在哈希表key 的所有字段和值
HKEYS key
获取哈希表key中所有的字段HLEN key
获取哈希表中字段的数量HVALS key
获取哈希表中所有值
127.0.0.1:6379> HGETALL myhash #获取所有的字段和值
1) "f1" #字段
2) "v1" #值
3) "f2"
4) "v2"
5) "f3"
6) "v3"
127.0.0.1:6379> HKEYS myhash #获取所有的字段
1) "f1"
2) "f2"
3) "f3"
127.0.0.1:6379> HLEN myhash #获取字段的数量
(integer) 3
127.0.0.1:6379> HVALS myhash #获取所有的值
1) "v1"
2) "v2"
3) "v3"
hdel: 删除哈希表key中一个/多个field字段
HDEL key field1 [field2…]
127.0.0.1:6379> HDEL myhash f1 f2 #删除f1和f2字段
(integer) 2
hincrby
HINCRBY key field increment: 增加 key
指定的哈希集中指定字段的数值。如果 key
不存在,会创建一个新的哈希集并与 key
关联。如果字段不存在,则字段的值在该操作执行前被设置为 0
127.0.0.1:6379> HINCRBY myhash f1 2
(integer) 2
127.0.0.1:6379> hget myhash f1
"2"
127.0.0.1:6379> HINCRBY myhash f1 2
(integer) 4
127.0.0.1:6379> HINCRBY myhash f1 2
(integer) 6
127.0.0.1:6379> hget myhash f1
"6"
4.5、Zset(有序集合)
以 z
开头, 有序集合的成员是唯一的,但分数(score)却可以重复。
zadd:添加一个或多个成员
ZADD key score member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数ZCARD key
获取有序集合的成员数ZCOUNT key min max
计算在有序集合中指定区间score的成员数
127.0.0.1:6379> ZADD myset 56 xiaoli 77 xiaohong 88 xiaoqiang #添加3个成员
(integer) 3
127.0.0.1:6379> ZCARD myset #查看成员数
(integer) 3
127.0.0.1:6379> ZCOUNT myset -inf +inf #返回所有的成员数
(integer) 3
127.0.0.1:6379> ZCOUNT myset 60 90 #返回区间内的成员数
(integer) 2
zincrby:给特定成员加分数
ZINCRBY key n member
有序集合中对指定成员的分数加上增量 nZSCORE key member
返回有序集中,成员的分数值ZRANK key member
返回有序集合中指定成员的索引
127.0.0.1:6379> ZINCRBY myset 5 xiaoli #给xiaoli分数加5
"61"
127.0.0.1:6379> ZSCORE myset xiaoli #查询xiaoli的分数
"61"
127.0.0.1:6379> ZSCORE myset xiaohong
"77"
127.0.0.1:6379> ZRANK myset xiaoli #返回xiaoli在集合中的索引
(integer) 0
zrange:通过索引区间查询成员
start、end为索引,min、max为值
ZRANGE key start end
通过索引区间返回有序集合成指定区间内的成员ZRANGEBYSCORE key min max
通过分数返回有序集合指定区间内的成员,-inf 和 +inf分别表示最小最大值ZREVRANGE key start end
返回有序集合中指定区间内的成员,通过索引,分数从高到底ZREVRANGEBYSCORRE key max min
返回有序集合中指定分数区间内的成员,分数从高到低排序
127.0.0.1:6379> ZRANGE myset 0 2 #查询[0-2]区间的成员
1) "xiaoli"
2) "xiaohong"
3) "xiaoqiang"
127.0.0.1:6379> ZRANGEBYSCORE myset -inf +inf #按分数从低到高排序,只有成员
1) "xiaoli"
2) "xiaohong"
3) "xiaoqiang"
127.0.0.1:6379> ZRANGEBYSCORE myset -inf +inf withscores #从低到高排序,带成员和分数
1) "xiaoli"
2) "61"
3) "xiaohong"
4) "77"
5) "xiaoqiang"
6) "88"
127.0.0.1:6379> ZREVRANGE myset 0 -1 ##按分数从高到低排序,只有成员,后面参数是索引
1) "xiaoqiang"
2) "xiaohong"
3) "xiaoli"
127.0.0.1:6379> ZREVRANGE myset 0 -1 withscores #从高到低排序,带成员和分数
1) "xiaoqiang"
2) "88"
3) "xiaohong"
4) "77"
5) "xiaoli"
6) "61"
127.0.0.1:6379> ZREVRANGEBYSCORE myset +inf -inf #从高到低排序,参数是值
1) "xiaoqiang"
2) "xiaohong"
3) "xiaoli"
127.0.0.1:6379> ZREVRANGEBYSCORE myset +inf -inf withscores
1) "xiaoqiang"
2) "88"
3) "xiaohong"
4) "77"
5) "xiaoli"
6) "61"
zrem:移除集合中的一个成员
ZREM key member
127.0.0.1:6379> ZRANGE myset 0 -1
1) "liaok"
2) "xiaoli"
3) "xiaohong"
4) "xiaoqiang"
127.0.0.1:6379> ZREM myset liaok
(integer) 1
127.0.0.1:6379> ZRANGE myset 0 -1
1) "xiaoli"
2) "xiaohong"
3) "xiaoqiang"
4.6、使用场景
String使用场景
- 计数器
- 统计多单位的数量
- 一个用户的粉丝数
- 一个有过期时间的验证码
List使用场景
List列表实际上它是一个数据结构的链表
- 栈(lpush lpop | rpush rpop)
- 队列(lpush rpop | rpush lpop)
set使用场景
- 共同关注
- 共同爱好
- 二度好友
hash使用场景
Hash存储用户信息之类的,经常变动的信息!Hash更适合于对象的存储,String更加适合字符串存储!
Zset使用场景
- set排序 存储班级成绩表、工资表排序
- 普通消息,1.重要消息 2.带权重进行判断
- 排行榜应用实现,取Top N测试
5、特殊数据类型
5.1、Geospatial(地理空间)
geoadd: 将具体经纬度的坐标存入一个或多个有序集合
用法:geoadd key longitud(经度) latitude(纬度) member […]
127.0.0.1:6379> GEOADD china:city 116.41667 39.91667 beijing #添加一个
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.43333 34.50000 shanghai
(integer) 1
127.0.0.1:6379> GEOADD china:city 117.20000 39.13333 tianjin 114.10000 22.20000 xianggang #添加两个
(integer) 2
经纬度规定:
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
geopos: 获取集合中的一个/多个成员坐标
用法:geopos key member [member…]
127.0.0.1:6379> GEOPOS china:city beijing #获取一个成员的坐标
1) 1) "116.41667157411575317"
2) "39.91667095273589183"
127.0.0.1:6379> GEOPOS china:city shanghai tianjin #获取两个成员的坐标
1) 1) "121.4333304762840271"
2) "34.49999971716130887"
2) 1) "117.19999998807907104"
2) "39.13333058676914078"
geodist
geodist key member1 member2 [m|km|ft|mi]
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。
现,取Top N测试
5、特殊数据类型
5.1、Geospatial(地理空间)
geoadd: 将具体经纬度的坐标存入一个或多个有序集合
用法:geoadd key longitud(经度) latitude(纬度) member […]
127.0.0.1:6379> GEOADD china:city 116.41667 39.91667 beijing #添加一个
(integer) 1
127.0.0.1:6379> GEOADD china:city 121.43333 34.50000 shanghai
(integer) 1
127.0.0.1:6379> GEOADD china:city 117.20000 39.13333 tianjin 114.10000 22.20000 xianggang #添加两个
(integer) 2
经纬度规定:
- 有效的经度从-180度到180度。
- 有效的纬度从-85.05112878度到85.05112878度。
geopos: 获取集合中的一个/多个成员坐标
用法:geopos key member [member…]
127.0.0.1:6379> GEOPOS china:city beijing #获取一个成员的坐标
1) 1) "116.41667157411575317"
2) "39.91667095273589183"
127.0.0.1:6379> GEOPOS china:city shanghai tianjin #获取两个成员的坐标
1) 1) "121.4333304762840271"
2) "34.49999971716130887"
2) 1) "117.19999998807907104"
2) "39.13333058676914078"
geodist
geodist key member1 member2 [m|km|ft|mi]
- m 表示单位为米。
- km 表示单位为千米。
- mi 表示单位为英里。
- ft 表示单位为英尺。