Redis数据类型及使用场景

young 516 2021-10-18

一共有8中数据类型,常用的是5种

String

String字符串

Int整数

Float字符串

常用操作命令

set young 2673 [EX 过期时间(秒)| PX 过期时间 毫秒] [NX key 不存在操作才能成功| XX 只有Key存在的时候才能成功]

mset young 2673 hui 666 批量set

mget young hui 批量get

strlen young value长度

append young good 给value后面追加

getrange young 0 8 返回value的指定范围的值,-1为所有

ncr young 对value进行递增1

incrby young 100 指定递增步幅

decr young 递减

decrby young 100 指定步幅递减

set f 2.6 设置浮点数

incrbyfloat f 7.3 对浮点数进行递增

位操作

一个字符是按8位二进制存储的

setbit k1 6 1修改value指定位上的值

getbit k1 0 获取指定位上的值

bitcount k1 查看key里有多少个count

bitpos k1 1 获取第一个1的下标

BITOP AND destkey srckey1 ... srckeyN,对一个或多个key求逻辑与,并将结果保存到destkey

BITOP OR destkey srckey1 ... srckeyN,对个或多个key求逻辑或,并将结果保存到destkey

BITOP XOR destkey srckey1 ... srckeyN,对个或多个key求逻辑异或,并将结果保存到destkey

BITOP NOTdestkey srckey1 ... srckeyN,对个或多个key求逻辑非,并将结果保存到destkey

应用场景

  1. 缓存

  2. 分布式session

    <dependency>
    	<groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    
  3. set NX EX 分布式锁

  4. incr 全局ID

  5. incr 计数器

  6. incr 限流

  7. 位操作 统计

Hash

redis中,key可以分层,key:一个冒号就是一层

set food:fruit:apple 1

set foot:fruit:banana 2

set food:meet:pork 3

set foot:meet:beaf 4

在hash中,一个key对应多个 field和value的键值对

value只能是字符串,不能是hash的嵌套

String与Hash的区别

  1. 使用String会创建很多的key,使用Hash就会减少空间

  2. 可以减少key冲突

  3. 减少资源消耗

  4. String可以单独设置过期时间,Hash只能针对key设置过期时间,不能针对field设置过期时间

  5. String可以做bit操作,Hash没有位操作

  6. 单个Hash的数据量很大的时候,Hash不会分散存储,会造成节点存储压力过大

Hash操作命令

hset h1 f 6 给key为h1的hash表中的f字段赋值

hmset h1 a 1 b 2 c 3 d 4 批量赋值

hget h1 a 获取key下制定field的值

hmget h1 a b c d 批量get

hkeys h1

hvals h1

hgetall h1

hget exists h1 a 判断是否存在,存在则返回1

hdel h1

hlen h1 元素个数

hincrby h2 a 10 对指定的field递增,需要递减时传负数即可

hincrbyfloat h2 b 7.3 对指定的field递增浮点数

应用场景

存储hash表

如购物车

key:用户id

field:商品id

value:商品数量

+1:hincrby id 1

-1:hdecrby id -1

删除:hdel

全选:hgetall

商品数:hlen

List

有序,左边是列表头,右边是列表尾,顺序是从左到右

元素可以重复

一个列表可以容纳2^32-1个元素

常用命令

lpush queue c 从队头插入

lpush queue d e

rpush queue f g 从队尾插入

lpop queue 从队头弹出一个元素

rpop queue 从队尾弹出一个元素

lindex queue 0 从左边获取第一个元素

lrange queue 0 -1 从左边范围获取列表的元素

blpop 阻塞弹出

lrem key count value 将列表中前count(数字)次出现的值为value(元素)删除

应用场景

消息队列

rpush lpop 队尾入队,队头出队,先进先出

blpop 从队头弹出元素,如果没有元素,会阻塞等待,直到队列里面有元素

brpop

blpop key1 timeout 从列表key1的队头弹出元素,如果没有就进行阻塞,阻塞timeout时间

Set

无序集合,元素不能重复,可以容纳2^32-1个元素

常用命令

sadd myset a b c d e f g 插入元素到set中

smembers myset 展示所有元素

scard myset 统计元素数量

srandmember key 随机返回一个元素

spop myset 随机返回并删除

srandmember myset 2 随机返指定个数元素

srem myset d e f 移除指定元素

sismember myset a 判断元素是否在set中

集合之间的操作

获取差集(只在第一个集合,不在第二个集合)要注意顺序

sdiff set1 set2

获取交集(在两个集合中都存在)

sinter set1 set2

获取并集(合并后去重)

sunion set1 set2

应用场景

抽奖

spop 随机返回并移除

点赞、签到、打卡

用like:t1001来维护t1001这条微博的所有点赞用户
点赞了这条微博:sadd like:t1001 u3001
取消点赞:srem like:t1001 u3001
是否点赞:sismember like:t1001
点赞的所有用户:smembers like:t1001
点赞数:scard like:t1001

商品标签

用tags:i5001来维护商品所有的标签
sadd tags:i5001 画面清晰
sadd tags:i5001 色彩好
sadd tags:i5001 流畅

商品筛选

sadd brand:apple iPhone

sadd brand:ios iPhone

sadd screensize:6.0-6.24 iPhone

sadd screentype:lcd iPhone

筛选商品,苹果的,ios的,屏幕在6.0-6.24之间的,屏幕材质是lcd屏幕

sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd

用户关注模型

互相关注

sismember bob:follow me

sismember me:follow bob

共同关注

sinter me:follow bob:follow

我关注的人也关注了他?

leo是不是我关注的人里面关注的用户?

sismember :follow leo

可能认识的人

sdiffstore mayknow me:follow joy:follow 取出差集,存到新的集合中

ZSet

有序集合,每个元素有个分值,分值相同则按照key的ASCII码来排序,分值越小或者ASCII码越小,就会排在越前面

常用命令

zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python 添加元素,元素的分值写在元素的前面

zrange myzset 0 -1 withscores 按照下标获取元素,withscores 会显示分值

zrevrange myzset 0 -1 withscores zrange的反转

带rev的命令都是反转操作

zrangebyscore myzset 20 30 withscores 按照分值的范围进行查找

zrem myzset php cpp 移除指定元素

zcard myzset 统计元素个数

zincrby myzset 5 python 给python元素的分值增加5分

zrank myzset python 获取元素的下标

zscore myzset java 获取元素的分值

zcount myzset 20 60 统计指定分值区间内的元素个数

应用场景

排行榜

id为6001的新闻点击数加一

zincrby hotNews:20211122 1 n6001

获取今天点击最多的15条

zrevrang hostNews:20211122 0 15 withscores

Geo、HyperLogLogs

Geo Spatial

用来保存地理位置信息的数据类型,也就是经纬度信息

常用命令

geoadd citys 121.48 31.22 sh 113.01 28.19 cs 存储经纬度信息

geopos citys cs 获取指定城市经纬度

geodist citys sh cs km 计算两个元素之间的距离,最后的属性是单位

georadius citys 113.01 28.19 5 km 距离指定经纬度5km以内的元素

geoadd citys 112.95 28.18 yl

georadiusbymember citys cs 20 km 距离指定元素不超过20km的元素

HyperLogLogs

提供一种基于基数的统计方法

可以用很少的内存计算很大的基数

会存在一定的误差

pfadd log 1 2 3 4 5 6 7 8 添加元素

pfcount log 统计元素

pfadd qs a b c d e f g

pfcount qs

pfmerge result log qs 合并两个hyperloglog