Redis(二)数据类型及操作命令实践

7 篇文章 0 订阅
7 篇文章 1 订阅

目录

1. String
2. Hash
3. List
4. Set
5. zSet
6. 应用场景

1. String(字符串)
  • string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
  • string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
  • string 类型是 Redis 最基本的数据类型,当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M。

基本命令:

100.69.12.9:6379> set name runoob
OK
100.69.12.9:6379> get name
"runoob"
100.69.12.9:6379> 

# set if not exist
100.69.12.9:6379> setnx job se
(integer) 1
100.69.12.9:6379> setnx job se
(integer) 0
100.69.12.9:6379> 

# set + expire
100.69.12.9:6379> setex job 5 mde
OK
100.69.12.9:6379> get job
"mde"
100.69.12.9:6379> get job
(nil)
100.69.12.9:6379> 

# set if not exist and expire
100.69.12.9:6379> set job job EX 5 NX
OK
100.69.12.9:6379> get job
"job"
100.69.12.9:6379> get job
(nil)
100.69.12.9:6379> 

  设置了过期时间后再set,会清除过期时间
  如果list结构中添加一个数据或者改变hset数据的一个字段是不会清除超时时间的;如果想要通过set去覆盖值那就必须重新设置expire。

100.69.12.9:6379> set job mde
OK
100.69.12.9:6379> expire job 5
(integer) 1
100.69.12.9:6379> set job ssse
OK
100.69.12.9:6379> get job
"ssse"
100.69.12.9:6379> get job
"ssse"
100.69.12.9:6379> get job
"ssse"
100.69.12.9:6379> 

一次操作多个key

100.69.12.9:6379> mset food mice computer leneve movie TheWD
OK
100.69.12.9:6379> mget food computer movie
1) "mice"
2) "leneve"
3) "TheWD"
100.69.12.9:6379> 

计数:

100.69.12.9:6379> set age 20
OK
100.69.12.9:6379> incr age
(integer) 21
100.69.12.9:6379> decr age
(integer) 20
100.69.12.9:6379> incrby age 5
(integer) 25
100.69.12.9:6379> decrby age 5
(integer) 20
100.69.12.9:6379> incrby age -1
(integer) 19
100.69.12.9:6379> 

KEYS pattern

查找所有符合给定模式 pattern 的 key 。

KEYS * 匹配数据库中所有 key
KEYS h?llo 匹配 hello , hallo 和 hxllo 等
KEYS h*llo 匹配 hllo 和 heeeeello 等
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo

100.69.12.9:6379> keys *
1) "age"
2) "food"
3) "name"
4) "computer"
5) "job"
6) "fod"
7) "movie"
100.69.12.9:6379> keys f*d
1) "food"
2) "fod"
100.69.12.9:6379> keys f?d
1) "fod"
100.69.12.9:6379> keys n[a]me
1) "name"
100.69.12.9:6379> 

返回目录

Hash(哈希)

Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。

记录帖子的点赞数、评论数和点击数 (hash)。
记录帖子的标题、摘要、作者和封面信息,用于列表页展示 (hash)。
缓存近期热帖内容 (帖子内容空间占用比较大),减少数据库压力 (hash)。
缓存用户行为历史,进行恶意行为过滤 (zset,hash)。

命令:

redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"

返回目录

List(列表)

  Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n)。
命令:

redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>

100.69.12.9:6379> lpush books java c c++ golang
(integer) 8

# 获取books的所有元素
100.69.12.9:6379> lrange books 0 -1
1) "golang"
2) "c++"
3) "c"
4) "java"
5) "golang"
6) "c++"
7) "c"
8) "java"

# 第二个元素
100.69.12.9:6379> lindex books 1
"c++"

# 只保留第4个到第9个元素
100.69.12.9:6379> ltrim books 3 8
OK
100.69.12.9:6379> lrange books 0 -1
1) "java"
2) "golang"
3) "c++"
4) "c"
5) "java"

# 清空books
100.69.12.9:6379> ltrim books 1 0
OK
100.69.12.9:6379> lrange books 0 -1
(empty list or set)
100.69.12.9:6379> 


队列 - 左进右出
100.69.12.9:6379> lpush books java c c++ golang
(integer) 4
100.69.12.9:6379> rpop books
"java"
100.69.12.9:6379> rpop books
"c"
100.69.12.9:6379> rpop books
"c++"
100.69.12.9:6379> rpop books
"golang"
100.69.12.9:6379> rpop books
(nil)
100.69.12.9:6379> 

栈 - 左进左出
100.69.12.9:6379> lpush books java c c++ golang
(integer) 4
100.69.12.9:6379> lpop books
"golang"
100.69.12.9:6379> lpop books
"c++"
100.69.12.9:6379> lpop books
"c"
100.69.12.9:6379> lpop books
"java"
100.69.12.9:6379> lpop books
(nil)
100.69.12.9:6379> 

返回目录

Set(集合)

特点:Redis的Set是string类型的无序集合。值的集合不能重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
命令:

redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "redis"
2) "rabitmq"
3) "mongodb"

> sadd books python
(integer) 1
> sadd books python  #  重复
(integer) 0
> sadd books java golang
(integer) 2
> smembers books  # 注意顺序,和插入的并不一致,因为 set 是无序的
1) "java"
2) "python"
3) "golang"
> sismember books java  # 查询某个 value 是否存在,相当于 contains(o)
(integer) 1
> sismember books rust
(integer) 0
> scard books  # 获取长度相当于 count()
(integer) 3
> spop books  # 弹出一个
"java"...

返回目录

zset (sorted set:有序集合)

  Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
zSet
zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。

zset 还可以用来存储学生的成绩,value 值是学生的 ID,score 是他的考试成绩。我们可以对成绩按分数进行排序就可以得到他的名次。…

命令:

redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"

> zadd books 9.0 "think in java"
(integer) 1
> zadd books 8.9 "java concurrency"
(integer) 1
> zadd books 8.6 "java cookbook"
(integer) 1
> zrange books 0 -1  # 按 score 排序列出,参数区间为排名范围
1) "java cookbook"
2) "java concurrency"
3) "think in java"
> zrevrange books 0 -1  # 按 score 逆序列出,参数区间为排名范围
1) "think in java"
2) "java concurrency"
3) "java cookbook"
> zcard books  # 相当于 count()
(integer) 3
> zscore books "java concurrency"  # 获取指定 value 的 score
"8.9000000000000004"  # 内部 score 使用 double 类型进行存储,所以存在小数点精度问题
> zrank books "java concurrency"  # 排名
(integer) 1
> zrangebyscore books 0 8.91  # 根据分值区间遍历 zset
1) "java cookbook"
2) "java concurrency"
> zrangebyscore books -inf 8.91 withscores # 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 代表 infinite,无穷大的意思。
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"
> zrem books "java concurrency"  # 删除 value
(integer) 1
> zrange books 0 -1
1) "java cookbook"
2) "think in java"...

应用场景
  • 记录帖子的点赞数、评论数和点击数 (hash)。
  • 记录用户的帖子 ID 列表 (排序),便于快速显示用户的帖子列表 (zset)。
  • 记录帖子的标题、摘要、作者和封面信息,用于列表页展示 (hash)。
  • 记录帖子的点赞用户 ID 列表,评论 ID 列表,用于显示和去重计数 (zset)。
  • 缓存近期热帖内容 (帖子内容空间占用比较大),减少数据库压力 (hash)。
  • 记录帖子的相关文章 ID,根据内容推荐相关帖子 (list)。
  • 如果帖子 ID 是整数自增的,可以使用 Redis 来分配帖子 ID(计数器)。
  • 收藏集和帖子之间的关系 (zset)。
  • 记录热榜帖子 ID 列表,总热榜和分类热榜 (zset)。
  • 缓存用户行为历史,进行恶意行为过滤 (zset,hash)。

返回目录

参考:

掘金小册:Redis 深度历险:核心原理与应用实践

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值