Redis学习笔记

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-k1=keep alive 0=reconnect1
8-rSET/GET/INCR 使用随机 key, SADD 使用随机值
9-P通过管道传输 请求1
10-q强制退出 redis。仅显示 query/sec 值
11–csv以 CSV 格式输出
12-l生成循环,永久执行测试
13-t仅运行以逗号分隔的测试命令列表。
14-IIdle 模式。仅打开 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种:

  1. 当前key没有设置过期时间,所以会返回-1.
  2. 当前key有设置过期时间,而且key已经过期,所以会返回-2.
  3. 当前key有设置过期时间,且key还没有过期,故会返回key的正常剩余时间.

重命名RENAMERENAMENX

  • 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 有序集合中对指定成员的分数加上增量 n
  • ZSCORE 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 表示单位为英尺。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值