Redis 5种数据结构及其使用场景举例--STRING

本文介绍Redis中String数据结构的应用场景,包括缓存、访问控制及布隆过滤器等,并列举了基本的String操作命令,如SET、GET、GETRANGE等。

String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可以表示的时候encoding 就是整型,其他都存储在 sdshdr 当做字符串)。

一、应用场景举例

String类型的是Redis所有数据结构中使用最为频繁的,也是最简单的数据结构,正所谓大道至简。

1、使用key-value来缓存一些不常改变的数据或,以减轻数据库的压力,如缓存组织架构信息、缓存权限配置信息、缓存用户访问次数、单点登录缓存用户sessionKey等,这种方式比较简单。

2、使用redis的原子性特性进行访问控制,如限制用户点击频率(每10秒可以点击一次)可用以下方式:

 

127.0.0.1:6379> setnx "order:confirm:{userId}" 1
(integer) 1

127.0.0.1:6379> expire "order:confirm:{userId}" 10
(integer) 1

 

以上操作中只有setnx 成功的线程才允许继续执行下去,否则,将直接提示用户“点击频率过快”

因为 setnx是原子操作,所以只有一个线程可以设置成功,其它线程设置失败,符合要求

当线程setnx 成功后,将可以执行接下来的操作,并为缓存key设置过期时间,过期后刚才设置的缓存失效,可以进行下一次点击

3、使用setbit和getbit命令来实现布隆过滤器,例如缓存所有商品id,防止缓存击穿问题

将所有商品编号n存到bitmap的第n位,1表示存在,这里假设有两个商品(12345,12346)

127.0.0.1:6379> setbit goodsIds 12345 1
(integer) 0
127.0.0.1:6379> setbit goodsIds 12346 1
(integer) 0

判断商品id是否存在

127.0.0.1:6379> getbit goodsIds 12345
(integer) 1
127.0.0.1:6379> getbit goodsIds 12347
(integer) 0
127.0.0.1:6379> 
 

二、下表列出了 redis string基本的相关命令:

序号

命令

举例

1

SET key value 

设置指定 key 的值

127.0.0.1:6379> set name 'xiaoming'

OK

2

GET key 

获取指定 key 的值。

127.0.0.1:6379> get name

"xiaoming"

3

GETRANGE key start end 

返回 key 中字符串值的子字符

127.0.0.1:6379> getrange name 4 8

"ming"

4

GETSET key value

将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

127.0.0.1:6379> getset name 'xiaohong'

"xiaoming"

5

GETBIT key offset

对 key 所储存的字符串值,获取指定偏移量上的位(bit)。

127.0.0.1:6379> setbit video 100 1

(integer) 0

127.0.0.1:6379> getbit video 100

(integer) 1

6

MGET key1 [key2..]

获取所有(一个或多个)给定 key 的值。

127.0.0.1:6379> mget name name1

1) "xiaoming"

2) "xiaohong"

7

SETBIT key offset value

对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。

127.0.0.1:6379> setbit video 100 1

(integer) 0

127.0.0.1:6379> getbit video 100

(integer) 1

8

SETEX key seconds value

将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。

127.0.0.1:6379> setex name 10 xiaoming

OK

9

SETNX key value

只有在 key 不存在时设置 key 的值。

127.0.0.1:6379> setnx xiaoming_age 10

(integer) 1

127.0.0.1:6379> setnx xiaoming_age 18

(integer) 0

10

SETRANGE key offset value

用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。

127.0.0.1:6379> setrange name 3 le

(integer) 8

127.0.0.1:6379> get name

"xialeing"

11

STRLEN key

返回 key 所储存的字符串值的长度。

127.0.0.1:6379> strlen name

(integer) 8

12

MSET key value [key value ...]

同时设置一个或多个 key-value 对。

127.0.0.1:6379> mset name xiaoming name1 xiaohong

OK

13

MSETNX key value [key value ...] 

同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

127.0.0.1:6379> msetnx name xiaoming name5 xiaogang

(integer) 0

127.0.0.1:6379> get name5

(nil)

14

PSETEX key milliseconds value

这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。

127.0.0.1:6379> psetex name 1000 xiaoming

OK

15

INCR key

将 key 中储存的数字值增一。

127.0.0.1:6379> set age 10

OK

127.0.0.1:6379> incr age

(integer) 11

16

INCRBY key increment

将 key 所储存的值加上给定的增量值(increment) 。

127.0.0.1:6379> set age 10

OK

127.0.0.1:6379> incrby age 2

(integer) 12

17

INCRBYFLOAT key increment

将 key 所储存的值加上给定的浮点增量值(increment) 。

127.0.0.1:6379> set weight 40

OK

127.0.0.1:6379> incrbyfloat weight 1.5

"41.5"

18

DECR key

将 key 中储存的数字值减一。

127.0.0.1:6379> set age 10

OK

127.0.0.1:6379> decr age

(integer) 9

19

DECRBY key decrement

key 所储存的值减去给定的减量值(decrement) 。

127.0.0.1:6379> set age 18

OK

127.0.0.1:6379> decrby age 8

(integer) 10

20

APPEND key value

如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。

127.0.0.1:6379> append name -xionghaizi

(integer) 19

127.0.0.1:6379> get name

"xiaoming-xionghaizi"

转载于:https://www.cnblogs.com/cblogs/p/9720373.html

<think>嗯,用户想了解Redis支持的数据类型及其适用场景,包括String、Hash、List、Set、ZSet,还要举例说明。首先,我需要回忆一下每种数据类型的特点和常见用途。 首先,String类型,这是最基础的数据类型,可以存储字符串、整数或者浮点数。适用场景可能包括缓存、计数器、分布式锁这些。比如用户提到的生成主键,可以用INCR命令,或者存储会话信息。不过要注意,如果一次性生成大量主键,用INCRBY来减少压力,这个在引用4里提到过。 然后是Hash类型,结构是key-field-value,适合存储对象,比如用户信息,每个字段对应一个属性。这样比用多个String存储更高效。比如用户信息中的姓名、年龄,可以用Hash来存。引用3里提到Hash的value分为field和value,field不能重复,但value可以,所以适合结构化数据。 List类型是链表结构,支持双向操作,可以用来做消息队列或者最新消息排行。比如文章的时间线,用LPUSH添加新文章,LRANGE获取最近的。不过引用2提到List做消息队列可能有不足,所以Redis 5.0引入了Stream类型,但用户的问题里没有提到Stream,所以这里可能不用展开。 Set是无序且唯一的集合,适合去重和集合操作,比如共同好友、标签系统。SINTER可以找交集,这样共同关注的人就可以用这个实现。引用4里也提到Set用于唯一性场景,比如点赞用户ID的存储。 ZSet是有序集合,每个元素关联一个分数,可以排序。适合排行榜、延迟队列。比如文章排行榜按点击量排序,用ZADD添加,ZRANGE获取前几名。引用2提到ZSet的应用场景,可能和排行榜相关。 需要确认每种类型的例子是否符合实际应用,比如String用作Session共享在集群环境下,引用4提到过。Hash存储用户信息在引用3有说明。List作为消息队列在引用2有讨论,但可能需要注意List的局限性,不过用户的问题里没有问优化,所以可能不用深入。 要确保每个数据类型的例子正确,并且引用对应的参考资料。比如String的计数器引用4,Hash的结构化数据引用3,List的消息队列引用2,Set的共同好友引用4,ZSet的排行榜引用2或4。 另外,用户可能关心如何选择合适的数据类型,比如什么时候用Hash而不是多个String,或者ZSet和Set的区别。需要明确说明各类型的优势和典型场景,帮助用户理解应用选择。 最后,生成的相关问题需要涵盖性能优化、比较其他数据结构、具体场景应用等,比如String和Hash的对比,ZSet实现延迟队列的具体方法,或者如何用Set做数据去重。这些问题要引导用户进一步探索。</think>### Redis数据类型详解及适用场景 #### 1. **String(字符串)** **特点**: 存储字符串、整数或浮点数,支持原子性操作 **适用场景**: - **缓存**: 存储高频访问的静态数据(如网页内容、用户基础信息)[^4] - **计数器**: 使用`INCR`/`DECR`实现文章阅读量、商品库存统计 ```bash INCR article:123:views # 文章阅读量+1 ``` - **分布式锁**: 通过`SETNX`实现简单分布式锁 - **唯一主键生成**: 利用`INCRBY`批量生成自增ID(如订单编号)[^4] #### 2. **Hash(哈希表)** **特点**: 键值对集合,适合存储结构化对象 **适用场景**: - **用户信息存储**: 单键保存用户全部属性(如姓名、年龄、地址) ```bash HSET user:1001 name "Alice" age 28 city "Shanghai" ``` - **商品详情**: 存储商品的多维度属性(价格、库存、描述)[^3] - **动态字段管理**: 支持灵活添加/删除字段 #### 3. **List(列表)** **特点**: 双向链表,支持有序插入和范围查询 **适用场景**: - **消息队列**: 通过`LPUSH`/`RPOP`实现简单消息队列(如任务队列)[^2] - **最新消息排行**: 使用`LPUSH`+`LTRIM`维护固定长度的动态列表 ```bash LPUSH news:latest "Breaking News" # 插入新闻 LTRIM news:latest 0 9 # 保留最新10条 ``` - **历史记录**: 用户浏览记录、操作日志 #### 4. **Set(集合)** **特点**: 无序且元素唯一,支持集合运算(交集、并集) **适用场景**: - **共同好友/兴趣**: 通过`SINTER`计算用户交集 ```bash SINTER user:1001:friends user:1002:friends ``` - **标签系统**: 存储文章/商品的唯一标签[^4] - **抽奖去重**: 使用`SADD`确保用户不重复参 #### 5. **ZSet(有序集合)** **特点**: 元素关联分数(score),按分数排序 **适用场景**: - **排行榜**: 按点击量/销售额排序(如热搜榜) ```bash ZADD hot:rank 1000 "News_A" 800 "News_B" # 插入数据 ZREVRANGE hot:rank 0 4 WITHSCORES # 获取Top5 ``` - **延迟队列**: 用时间戳作为score实现定时任务[^2] - **优先级任务调度**: 按任务优先级排序执行 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值