Akemi

Redis数据类型与常用操作

2024/09/19

key(键)的常用操作

keys

查看当前库中所有的key
在生产环境中不要直接使用,因为查询过程属于阻塞状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
例:
set k1 10
set k2 20
set k3 30

keys
输出(阻塞)
k1
k2
k3

redis-cli --scan "*"
输出(非阻塞、推荐)
k1
k2
k3

支持通配符:
*
?
[]

exists

用来判断某个键是否存在

1
2
3
4
5
6
7
8
9
exists key

exists k1
返回
1

exists k1 k2 k4
返回
2

type

查看key对应value的类型,比如string list等

1
type k1

del

删除已存在的key,如果不存在会忽略

1
del k1

expire

给key设置几秒的过期时间,如果成功返回1,不存在返回0

1
2
3
expire k2 20
#
让k2在20秒后过期自动删除

ttl

返回key剩余的过期时间
如果没有设置,返回-1
如果不存在,返回-2

1
ttl k2

persist

移除key的过期时间,使其永不过期
如果移除成功返回1
如果key不存在或没有设置过期时间返回0

1
persist k1

String字符串操作

String是Redis最基本的类型,一个key对应一个value,因为string是二进制的,所以可以存放任何数据,最大支持512M数据

set

设置存储值,如果已经存储了值,就会重写旧值

get

获取key的值,如果不存在,返回nil

append

将给定的value追加到key值末尾
如果没有这个key,就新建一个key给他赋值

1
2
3
4
append k1 20
get k1
输出
1020

strlen

获取key的字符串值的长度,如果不是字符串string,则返回一个错误
strlen k1

setex

可以用一条命令就设置value与过期时间
setex key time valu setex k4 10 40

setnx

在key不存在时设置key的值
setnx k1 10 返回0,失败
setnx k5 50 返回1,成功

getrange

get range从字符串提取出区间内的值

1
2
3
4
5
set k10 wangsheng
getrange k10 2 4
输出
wangsheng的2-4
即ang

setrange

set range修改字符串中,区间内的值

1
2
3
4
5
set k10 wangsheng
setrange k10 1 xhy
输出
1指wangsheng第一位开始
即wxhysheng

incr

将key的值(数字)加一
如果不存在这个key,则先置零,然后加1,就是1
如果不为数值则返回错误

decr

将key的值(数字)减一
如果不存在这个key,则先置零,然后减1,就是-1
如果不为数值则返回错误

incrby/decrby

格式:incrby/decrby key step
将key存储的数字按照step的值进行加减
如果不为数值则返回错误

mset

一次性设置多个key/value
mset k1 10 k2 20 k3 30

mget

一次性获得多个key的value
mget k1 k2 k3
如果有key不存在则返回nil

getset

取得一个key后,将新的值赋值给key

1
2
3
4
5
getset k1 20
返回
10
get k1
20

List列表——排行榜

List是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部或者尾部,其底层是一个双向链表

lpush/rpush

从左(头部)或者右边(尾部)插入一个值或多个值

1
2
3
4
5
6
7
8
lpush key1 value1 value2 value3
rpush...

例:
lpush k1 v1 v2 v3
rpush k1 v4 v5 v6
此时这个v1列表是一个双向链表:
v3 v2 v1 v4 v5 v6

lrange

返回list中start与end之间的元素
格式:lrange key start end
start和end都是下标,list的下标从0开始,-1表示最后一个元素
以上面的做比方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
lrange k1 0 2
返回
v3
v2
v1

lrange k1 0 -1
也就是取出所有值,返回
v3
v2
v1
v4
v5
v6

lpop/rpop

和python的pop差不多,将元素弹出并且返回,不赘述了

lindex

跟python里的index也差不多,通过index下标,来获取key里元素的值

1
2
3
4
lindex key index
lindex k1 0
返回
v3

llen

获取列表长度

lrem

从左开始删除元素
根据value删除相同的元素

1
2
3
4
lrem key count value
lrem k1 2 v1
指从左开始删除
k1中2个v1元素

linsert

插入,在列表中value值前边或后边插入一个新值

1
2
3
4
5
6
7
linsert key before/after value newvalue
例:
linsert k1 before v1 v5
在v1前面插入一个v5

linsert k1 after v2 v5
在v2后面插入一个v5

lset

对指定索引的值进行修改
lset k1 0 v0 将k1中索引为0的元素修改为v0

Set集合——兴趣标签、共同好友

set是字符串的无序集合,也就是集合,和python中的差不多,相同元素自动去重

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
sadd
添加元素到集合中
sadd k1 v1 v2 v3

smembers
取出集合的所有元素
smembers k1

sismember
判断集合中是否有x元素
如果有返回1否则返回0
sismember k1 x

scard
返回集合有多少个元素
scard k1

srem
删除集合中的元素x和y
srem k1 x y

spop
随机删除一个元素并弹出
spop k1

srandmember
随机取出n个元素(不会删除)
srandmember k1 2
↑随机取出k1中的2个元素

smove
将x元素从a集合移动到b集合
smove a b x
如果a中不存在x元素,则返回0

sinter
返回两个集合的交集
sinter k1 k2

sunion
返回两个集合的并集
sunion k1 k2

sdiff
返回两个集合的差集元素
sdiff k1 k2

Hash

Hash是一个键值对的集合

Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

Hash类型与python中字典(键值对)类型的数据比较相似,只不过hash类型中使用的是field和value,字典中使用的是key和value

在字典中查询一个value往往需要指定key,而在redis中查询一个filed需要同时指定key和filed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
hset
给key的filed进行复制
hset key field value

hget
获取filed的value,指定key和field
hget key field

hmset
批量设置哈希的字段及值
hmset key field1 value1 field2 value2……

hexists
判断是否存在field
hexists key field

hkeys
获取所有field

hvals key
获取所有的value

hincrby
增加一个key中的filed的value值
hincrby key field increment
例:
hincrby k1 age 10
就是给k1中age对应的值+10,,
例:
hincrby k1 money -1000
就是给k1中money对应的值减1000

hdel
删除一个或多个字段
hdel key field1 field2……

hsetnx
hash中不存在的字段赋值,相当于追加
hsetnx key field value

如果哈希表不存在,创建新哈希表并执行hsetnx
如果字段已经存在于哈希表中,操作无效。
如果 key不存在,创建新哈希表并执行hsetnx

Zset

Zset与Set非常相似,是一个没有重复元素的String集合。不同之处是Zset的每个元素都关联了一个分数

Zset可以通过一个分数来对元素进行排序,是有序集合,这个分数决定了Zest中元素的索引位置

(和hash这种字典结构的不同,他只要往里加元素就行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
zadd
将一个或多个元素和分数加入有序集key中
zadd key score1 value1 score2 value2……
如果key不存在,自动创建

zrange
根据索引返回集合中的元素
zrange k1 0 -1
返回所有元素
zrange k1 0 -1 withscores
返回集合中所有元素,并携带元素分数

zrangebyscore
根据元素分数,返回所有集合中的元素,并且按照从小到大排序
zrangebyscore k1 200 400
返回k1中,200-400分之间的元素递增排序

zincrby
为元素的分数累加一个值
zincrby k1 50 java 给集合k1的java元素加上50

zrem
删除集合下的元素
zrem k1 wangsheng
删除集合k1下的wangsheng元素

zcount
统计分数区间中元素的个数
zcount k1 100 300
统计100分到300分中间元素的个数

zrank
返回vlaue在集合中的排名
zrank key value

Bitmaps

是一种二进制的存储方式,只有0和1

Redis提供了Bitmaps这个 “数据结构” 可以实现对位的操作
合理地使用位能够有效地提高内存使用率和开发效率。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
setbit
设置bitmaps
setbit key offset value

可以增加很多个字节组
例:
王盛5月份的出勤情况,1号到5号全都正常出勤
setbit wangsheng:5 1 1
setbit wangsheng:5 2 1
setbit wangsheng:5 3 1
setbit wangsheng:5 4 1
setbit wangsheng:5 5 1

getbit
获取bitmaps
例:
获取王盛51日的考勤情况
getbit wangsheng:5 1
返回
1

bitcount
统计bitmap中1出现的次数
例:
统计王盛5月、7月的出勤情况
bitcount wangsheng:5 7

bitop and/or
将多个两个bitmaps通过交集 或 并集的方式合并为新的bitmaps
bitop and k3 k1 k2 通过求交集将k1 k2合并成k3
bitop or k3 k1 k2 通过求并集将k1 k2合并成k3

使用场景 活跃天数、签到、活跃用户、布隆过滤器

Untitled

Untitled

Geospatia类型-地理信息

GEO,Geographic,地理信息的缩写。该类型就是元素的二维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
geoadd
将北京的经纬度和名称添加到china
geoadd china 116.405285 39.904989 beijing
将成都和上海的经纬度、名称添加到china
geoadd china 104.065735 30.659462 chengdu 121.472644 31.231706 shanghai

geopos
从key中返回指定名称如beijing的位置
geopos china beijing

geodist
返回两个位置之间的距离,可选单位[m|km|ft|mi]
geodist china beijing chengdu m
查看北京和成都的距离,以米为单位

georadius
以给定的经纬度为中心,给一个距离,给出范围内包含的位置元素
georadius china 110 30 1200 km
#获取经纬度110 30为中心,在china内1200公里范围内的所有元素。

Hyperloglog——流量统计、播放数等

做站点流量统计的时候一般会统计页面UV(独立访客:unique visitor)和PV(即页面浏览量:page view)。redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定并且很小的

基数

基数集是将数据集去除重复元素后的产物
Hyperlog可以在超大基数集时快速进行运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
pfadd
将所有元素参数添加到 Hyperloglog 数据结构中
pfadd book1 uid1 uid2 uid3
给book1添加uid1 uid2 uid3(有uid1 2 3 3个人看了这本书)

pfcount
统计基数的总数(去重后)
pfcount book1
统计book1有几个人看了,返回
3
pfcount book1 book2
统计book1和2有几个人看了

pfmerge
将多个Hyperloglog进行合并
pfmerge book book1 book2
将book1看的人和book2看得人合并到book,并且计算
(来计算两个书的活跃人数)

主要用于网站PV统计、UV统计
统计访问量
统计在线数
真实阅读数等
CATALOG
  1. 1. key(键)的常用操作
  2. 2. String字符串操作
  3. 3. List列表——排行榜
  4. 4. Set集合——兴趣标签、共同好友
  5. 5. Hash
  6. 6. Zset
  7. 7. Bitmaps
  8. 8. Geospatia类型-地理信息
  9. 9. Hyperloglog——流量统计、播放数等