Redis基本数据类型介绍

String 字符串

存储类型

可以用来存储字符串、整数、浮点数

操作命令

设置多个值(批量操作,原子性)
mset vincent 9527 ling 666
设置值,如果 key 存在,则不成功

setnx vincent
基于此可实现分布式锁。用 del key 释放锁。

但如果释放锁的操作失败了,导致其他节点永远获取不到锁,怎么办?
解决:加过期时间

单独用 expire 加过期,也失败了,无法保证原子性,怎么办?
解决:多参数
set key value [expiration EX seconds|PX milliseconds][NX|XX]

使用参数的方式
set lock1 1 EX 10 NX

(整数)值递增
incr vincent
incrby vincent 20

(整数)值递减
decr vincent
decrby vincent 35

浮点数增量
set f 2.6
incrbyfloat f 7.3

获取多个值
mget vincent ling

获取值长度
strlen vincent

字符串追加内容
append vincent hello

获取指定范围的字符
getrange vincent 0 8

应用场景

  • 缓存

String 类型
例如:热点数据缓存(例如报表,热点新闻),对象缓存,全页缓存。
可以提升热点数据的访问速度。

  • 数据 共享分布式

String类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享
例如:分布式 Session

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
  • 分布式锁

STRING 类型 setnx 方法,只有不存在时才能添加成功,返回 true(参考

public Boolean getLock(Object lockObject) {
    jedisUtil = getJedisConnetion();
    boolean flag = jedisUtil.setNX(lockObj, 1);
    if (flag) {
        expire(locakObj, 10);
    }
    return flag;
}​
public void releaseLock(Object lockObject) {
    del(lockObj);
}
  • 全局 ID

INT 类型,INCRBY,利用原子性

incrby userid 1000
  • 计数器

INT 类型,INCR 方法
例如:文章的阅读量,微博点赞数,允许一定的延迟,先写入 Redis 再定时同步到数据库。

  • 限流

INT 类型,INCR 方法
以访问者的 IP 和其他信息作为 key,访问一次增加一次计数,超过次数则返回 false。

 

Hash 哈希

存储类型

包含键值对的无序散列表。value 只能是字符串,不能嵌套其他类型。

 

同样是存储字符串,Hash 与 String 的主要区别?

1、把所有相关的值聚集到一个 key 中,节省内存空间
2、只使用一个 key,减少 key 冲突
3、当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU 的消耗

Hash 不适合的场景

1、Field 不能单独设置过期时间
2、没有 bit 操作
3、需要考虑数据量分布的问题(value 值非常大的时候,无法分布到多个节点)

操作命令

hset h1 f 6
hset h1 e 5
hmset h1 a 1 b 2 c 3 d 4

hget h1 a
hmget h1 a b c d
hkeys h1
hvals h1
hgetall h1

hget exists h1
hdel h1
hlen h1

应用场景

  • String

String 可以做的事情,Hash 都可以做。

  • 存储对象类型的数据

比如对象或者一张表的数据,比 String 节省了更多 key 的空间,也更加便于集中管理

  • 购物车

key:用户 id;   field:商品 id;   value:商品数量


+1:hincr

-1:hdecr

删除:hdel

全选:hgetall

商品数:hlen

List列表

存储类型

存储有序的字符串(从左到右),元素可以重复。可以充当队列和栈的角色。

操作命令

元素增减:
lpush queue a

lpush queue b c

rpush queue d e

lpop queue

rpop queue
​
blpop queue

brpop queue

取值:
lindex queue 0
lrange queue 0 -1

应用场景

因为 List 是有序的,可以用来做用户时间线

  • 消息队列

List 提供了两个阻塞的弹出操作:BLPOP/BRPOP,可以设置超时时间。


BLPOP:BLPOP key1 timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。


BRPOP:BRPOP key1 timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。


队列:先进先出:rpush blpop,左头右尾,右边进入队列,左边出队列。


栈:先进后出:rpush brpop

Set 集合

存储类型

String 类型的无序集合,最大存储数量 2^32-1(40 亿左右)

操作命令

添加一个或者多个元素
sadd myset a b c d e f g

获取所有元素
smembers myset

统计元素个数
scard myset

随机获取一个元素
srandmember key

随机弹出一个元素
spop myset

移除一个或者多个元素
srem myset d e f

查看元素是否存在
sismember myset a

应用场景

  • 抽奖

随机获取元素
spop myset

  • 点赞、签到、打卡

微博的 ID 是 t1001,用户 ID 是 u3001。
用 like:t1001 来维护 t1001 这条微博的所有点赞用户。


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

  • 商品标签

用 tags:i5001 来维护商品所有的标签。
sadd tags:i5001 画面清晰细腻
sadd tags:i5001 真彩清晰显示屏
sadd tags:i5001 流畅至极

  • 商品筛选
获取差集
sdiff set1 set2

获取交集( intersection )
sinter set1 set2

获取并集
sunion set1 set2

iPhone11 上市了
sadd brand:apple iPhone11
sadd brand:ios iPhone11
sadd screensize:6.0-6.24 iPhone11
sadd screentype:lcd iPhone11


筛选商品,苹果的,iOS 的,屏幕在 6.0-6.24 之间的,屏幕材质是 LCD 屏幕
sinter brand:apple brand:ios screensize:6.0-6.24 screentype:lcd

ZSet  有序集合

存储类型

sorted set,有序的 set,每个元素有个 score


score 相同时,按照 key 的 ASCII 码排序

数据结构对比:

数据结构是否允许重复元素是否有序有序实现方式
列表list索引下标
集合set
有序集合zset分值score

操作命令

添加元素
zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python

获取全部元素
zrange myzset 0 -1 withscores
zrevrange myzset 0 -1 withscores

根据分值区间获取元素
zrangebyscore myzset 20 30

移除元素
也可以根据 score rank 删除
zrem myzset php cpp

统计元素个数
zcard myzset

分值递增
zincrby myzset 5 python

根据分值统计个数
zcount myzset 20 60

获取元素 rank
zrank myzset java

获取元素 score
zsocre myzset java

也有倒序的 rev 操作(reverse)

应用场景

  • 排行榜

id 为 1001 的新闻点击数加 1:zincrby hotNews:20190926 1 n1001
获取今天点击最多的 15 条:zrevrange hotNews:20190926 0 15 withscores

 

其他数据结构简介

BitMaps

Bitmaps 是在字符串类型上面定义的位操作。一个字节由 8 个二进制位组成。

set k1 a
获取 value 在 offset 处的值(a 对应的 ASCII 码是 97,转换为二进制数据是 01100001)

getbit k1 0
修改二进制数据(b 对应的 ASCII 码是 98,转换为二进制数据是 01100010)

setbit k1 6 1
setbit k1 7 0
get k1
统计二进制位中 1 的个数

bitcount k1
获取第一个 1 或者 0 的位置

bitpos k1 1
bitpos k1 0

BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数:

BITOP AND destkey srckey1 … srckeyN ,对一个或多个 key 求逻辑与,并将结果保存到 destkey
BITOP OR destkey srckey1 … srckeyN,对一个或多个 key 求逻辑或,并将结果保存到 destkey
BITOP XOR destkey srckey1 … srckeyN,对一个或多个 key 求逻辑异或,并将结果保存到 destkey
BITOP NOT destkey srckey,对给定 key 求逻辑非,并将结果保存到 destkey

应用场景
       用户访问统计
       在线用户统计

 

Hyperloglogs

提供了一种不太准确的基数统计方法,比如统计网站的 UV,存在一定的误差。

 

Streams

5.0 推出的数据类型。支持多播的可持久化的消息队列,用于实现发布订阅功能,借鉴了 kafka 的设计。

 

应用场景总结

缓存——提升热点数据的访问速度
共享数据——数据的存储和共享的问题
全局 ID —— 分布式全局 ID 的生成方案(分库分表)
分布式锁——进程间共享数据的原子操作保证
在线用户统计和计数
队列、栈——跨进程的队列/栈
消息队列——异步解耦的消息机制
服务注册与发现 —— RPC 通信机制的服务协调中心(Dubbo 支持 Redis)
购物车
新浪/Twitter 用户消息时间线
抽奖逻辑(礼物、转发)
点赞、签到、打卡
商品标签
用户(商品)关注(推荐)模型
电商产品筛选
排行榜

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值