【Redis高手修炼之路】②Redis的五大数据类型

这篇具有很好参考价值的文章主要介绍了【Redis高手修炼之路】②Redis的五大数据类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Redis高手修炼之路】②Redis的五大数据类型

1.字符串

字符串是Redis最基础的数据类型:

  • 字符串类型实际可以存储字符串、数字、二进制数据;
  • Redis中的键都是字符串类型,值也支持字符串类型;
  • 字符串类型的存储空间是有限的,最大可以存放512M的数据。

1.1 常用命令:

1.1.1 添加、查询、获取长度、字符串的追加

set key value设置指定 key 的值

get key获取指定 key 的值

getrange key start end返回 key 中字符串值的子字符

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

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

append key value如果 key 已经存在并且是一个字符串,将 value 追加到 key 原来的值的末尾

127.0.0.1:6379> set name tom
OK
127.0.0.1:6379> get name
"tom"
#当值为字符串时要加双引号,或者之间加逗号隔开,空格代表命令结束
127.0.0.1:6379> set address "bei jing" 
OK
127.0.0.1:6379> set hobby basketball,football
OK
127.0.0.1:6379> get address
"bei jing"
127.0.0.1:6379> get hobby
"basketball,football"
127.0.0.1:6379> append hobby "music"  #追加字符串
(integer) 24
127.0.0.1:6379> get hobby
"basketball,footballmusic"
127.0.0.1:6379> getrange address 0 2 #截取字符串,下标从0开始
"bei"
127.0.0.1:6379> strlen address
(integer) 8

1.1.2 批量插入和查询

mset key value [key value ...]同时设置一个或多个 键值对

mget key1 [key2...]获取一个或多个给定key的值

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

127.0.0.1:6379> mset a 1 b 2 c 3
OK
127.0.0.1:6379> mget a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> msetnx weight "170" height "100"
(integer) 1
127.0.0.1:6379> mget weight height
1) "170"
2) "100"

1.1.3 设置key值的生存时间

setex key seconds value设置key-value ,并设置key的生存时间(秒)

psetex key milliseconds value设置key-value ,并设置key的生存时间(毫秒)

setnx key value在 key 不存在时设置 key 的值

127.0.0.1:6379> setex id 10 "1001"
OK
127.0.0.1:6379> get id
"1001"
127.0.0.1:6379> get id  #10s之后就过期了
(nil)
127.0.0.1:6379> psetex key 10000 abc
OK
127.0.0.1:6379> get key
"abc"
127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> setnx id "1002"
(integer) 1
127.0.0.1:6379> get id
"1002"

1.1.4 key值的自增和自减

incr key key值自动增一

decr key key 值自动减一

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

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

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

127.0.0.1:6379> set age "15"
OK
127.0.0.1:6379> get age
"15"
127.0.0.1:6379> incr age
(integer) 16
127.0.0.1:6379> incrby age 5
(integer) 21
127.0.0.1:6379> decr age
(integer) 20
127.0.0.1:6379> decrby age 5
(integer) 15
127.0.0.1:6379> incrbyfloat age 1.5
"16.5"

1.2 使用场景

  • 缓存
    set user:1 “{id:1,name:tom,…}” ex 300

  • 计数:比如计算页面的访问次数或者某个链接的点击次数
    set post:1 “0”
    incr post:1 …

  • 限速:限制一分钟只能设置5次密码
    set pwd:1 5 ex 60
    decr pwd:1

2.哈希

Redis的键所对应的值本身又是一个键值对结构

【Redis高手修炼之路】②Redis的五大数据类型

与关系型数据库的区别:

1.关系型数据库是结构化的,若添加新的列,会影响到所有的行,而哈希类型是稀疏的,每个键可以有不同的哈希数据;

2.关系型数据库则可以支持复杂的关系查询

2.1 常用命令

2.1.1 添加、查询、删除、获取长度以及是否存在

hset key field value将哈希表 key 中的字段 field 的值设为 value

hget key field获取存储在哈希表中指定字段的值/td>

hdel key field2 [field2]删除一个或多个哈希表字段

hkeys key获取所有哈希表中的字段

hvals key获取哈希表中所有值

hgetall key获取在哈希表中指定 key 的所有字段和值

hlen key获取哈希表中字段的数量

hexists key field查看哈希表 key 中,指定的字段是否存在

127.0.0.1:6379> hset user name tom age "18"
(integer) 2
127.0.0.1:6379> hget user name
"tom"
127.0.0.1:6379> hgetall user
1) "name"
2) "tom"
3) "age"
4) "18"
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hgetall user
1) "name"
2) "tom"
127.0.0.1:6379> hkeys user
1) "name"
127.0.0.1:6379> hlen user
(integer) 1
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hexists user age
(integer) 0
127.0.0.1:6379> hvals user
1) "tom"

2.1.2 key值的增加

hincrby key field increment为哈希表 key 中的指定字段的整数值加上增量 increment

hincrbyfloat key field increment为哈希表 key 中的指定字段的浮点数值加上增量 increment

127.0.0.1:6379> hset user score "85"
(integer) 1
127.0.0.1:6379> hincrby user score 5
(integer) 90
127.0.0.1:6379> hincrbyfloat user score 1.5
"91.5"

2.1.3 批量添加字段

hsetnx key field value在字段 field 不存在时,设置哈希表字段的值

hmget key field1 [field2]获取所有给定字段的值

hmset key field1 value1 [field2 value2]同时将多个域值对设置到哈希表中

127.0.0.1:6379> hsetnx user grade 3
(integer) 1
127.0.0.1:6379> hmget user name age grade
1) "tom"
2) "20"
3) "3"
127.0.0.1:6379> hmset user gender M class 1
OK
127.0.0.1:6379> hgetall user
 1) "name"
 2) "tom"
 3) "age"
 4) "20"
 5) "score"
 6) "91.5"
 7) "grade"
 8) "3"
 9) "gender"
10) "M"
11) "class"
12) "1"

2.2 三种存储方式的区别

  • 常规的字符串
    优点:每个键都可以单独设置过期时间;
    缺点:键占用大量内存,信息内聚性差;

  • 序列化字符串
    优点︰编程简单;
    缺点:全量更新(反序列化->更新->序列化);

  • 哈希类型
    优点:每个键都可以单独更新;
    缺点:如果没有控制好编码,会消耗更多内存。

3.列表

1.列表是线性有序的数据结构;
2.列表中的元素是可以重复的;
3.—个列表最多能存储232-1个元素。

3.1 常用命令

3.1.1 列表的插入、移除及查询

lpush key value1 [value2]将一个或多个值插入到列表头部(左插入)

rpush key value1 [value2] 在列表尾部添加一个或多个值(右插入)

rpop key移除并输出列表最后一个元素

lpop key移出并输出列表的第一个元素

llen key获取列表长度

lindex key index 通过索引获取列表中的元素

lrange key start stop获取列表指定范围内的元素

127.0.0.1:6379> lpush list 3 2 1
(integer) 3
127.0.0.1:6379> rpush list 4 5 6
(integer) 6
127.0.0.1:6379> lrange list 0 -1 # 相当于lrange list 0 5-1表示末尾
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> rpop list
"6"
127.0.0.1:6379> lpop list
"1"
127.0.0.1:6379> llen list
(integer) 4
127.0.0.1:6379> lindex list 3
"5"

3.1.2 对已有列表进行更新、截取元素

lrem key count value根据value移除指定数量的值

lset key index value通过索引更新元素

linsert key before|after pivot value在列表的元素前或者后插入元素

lpushx key value 将一个或多个值插入到已存在的列表头部

rpushx key value将一个或多个值插入到已存在的列表尾部

ltrim key start stop裁剪列表元素,只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

rpoplpush source destination移除列表的最后一个元素,并将该元素添加到另一个列表并返回

127.0.0.1:6379> lpush mylist a 1 a 2 b 3 b 4 c 5 a 6
(integer) 12
127.0.0.1:6379> lrem mylist 2 a   #删除前两个a
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
 1) "6"
 2) "5"
 3) "c"
 4) "4"
 5) "b"
 6) "3"
 7) "b"
 8) "2"
 9) "1"
10) "a"
127.0.0.1:6379> lset mylist 1 12
OK
127.0.0.1:6379> linsert mylist before 3 111   #在3前面插入111
(integer) 11
127.0.0.1:6379> lrange mylist 0 -1
 1) "6"
 2) "12"
 3) "c"
 4) "4"
 5) "b"
 6) "111"
 7) "3"
 8) "b"
 9) "2"
10) "1"
11) "a"
127.0.0.1:6379> lpushx mylist aaa
(integer) 12
127.0.0.1:6379> rpushx mylist bbb
(integer) 13
127.0.0.1:6379> lrange mylist 0 -1
 1) "aaa"
 2) "6"
 3) "12"
 4) "c"
 5) "4"
 6) "b"
 7) "111"
 8) "3"
 9) "b"
10) "2"
11) "1"
12) "a"
13) "bbb"
127.0.0.1:6379> ltrim mylist 0 5
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "aaa"
2) "6"
3) "12"
4) "c"
5) "4"
6) "b"
127.0.0.1:6379> rpoplpush mylist newlist
"b"

3.2 使用场景

  • 消息队列:生产者通过lpush命令从列表左侧插入元素;消费者通过brpop命令从列表右侧弹出元素;
  • 内容列表:有序存储用户的待办事项、收藏文章等内容;

4.集合

1.集合中的元素是无序、不可重复的,一个集合最多能存储232-1个元素;
2.集合除了支持对元素的增删改查之外,还支持对多个集合取交集、并集、差集。

4.1 常用命令

4.1.1 添加、删除

sadd key member1 member2向集合中添加一个或多个成员

scard key获取集合成员数

spop key移除并返回集合中的一个随机元素

smembers key返回集合中的所有成员

sismember key member判断member是否是集合key的成员

srem key member1 member2移除集合中的一个或多个成员

smove source destination member将 member 元素从 source 集合移动到 destination 集合

127.0.0.1:6379> sadd myset1 a b c d e f
(integer) 6
127.0.0.1:6379> sadd myset2 d e f g h i
(integer) 6
127.0.0.1:6379> scard myset1
(integer) 6
127.0.0.1:6379> smembers myset1
1) "b"
2) "a"
3) "c"
4) "f"
5) "d"
6) "e"
127.0.0.1:6379> spop myset1 2  # 随机移除2个成员
1) "e"
2) "b"
127.0.0.1:6379> sismember myset1 c   #查询集合中是否存在c
(integer) 1
127.0.0.1:6379> srem myset1 f #将集合中的f移除
(integer) 1
127.0.0.1:6379> smove myset1 newset a  #将a从集合myset1移动到newset
(integer) 1
127.0.0.1:6379> smembers newset
1) "a"

4.1.2 交集、并集、差集

sinter key1 key2返回给定的集合的交集

sunion key1 key2返回给定的集合的并集

sdiff key1 key2返回给定的集合的差集

sinterstore destination key1 key2返回给定的集合的交集并存到destination中

sunionstore destination key1 key2返回给定的集合的并集并存到destination中

sdiffstore destination key1 key2返回给定的集合的差集并存到destination中

127.0.0.1:6379> sinter myset1 myset2
1) "d"
2) "e"
127.0.0.1:6379> sunion myset1 myset2
1) "d"
2) "e"
3) "a"
4) "c"
5) "g"
6) "h"
7) "f"
8) "b"
9) "i"
127.0.0.1:6379> sdiff myset1 myset2
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> sinterstore newset1 myset1 myset2
(integer) 2
127.0.0.1:6379> smembers newset1
1) "d"
2) "e"
127.0.0.1:6379> sunionstore newset2 myset1 myset2
(integer) 9
127.0.0.1:6379> smembers newset2
1) "d"
2) "e"
3) "a"
4) "c"
5) "g"
6) "h"
7) "f"
8) "b"
9) "i"
127.0.0.1:6379> sdiffstore newset3 myset1 myset2
(integer) 3
127.0.0.1:6379> smembers newset3
1) "a"
2) "b"
3) "c"

4.1.3 随机数

srandmember key count随机返回集合中的一个或多个元素

127.0.0.1:6379> srandmember myset1 2 #随机返回两个元素
1) "b"
2) "a"
127.0.0.1:6379> srandmember myset1 
"a"
127.0.0.1:6379> srandmember myset1 
"d"

4.2 使用场景

  • 点赞:统计一篇文章的点赞数量
    • 命令:scard like
  • 抽奖:在一组数据中随机弹出一个元素以达到抽奖的目的
    • 命令:spop user
  • 共同关注:通过求两个集合的交集来达到目的
    • 命令:sinterstore follow follow1 follow2

5.有序集合

1.有序集合保留了集合元素不能重复的特点;
2.有序集合会给每个元素设置一个分数,并以此作为排序的依据;
3.有序集合不能包含相同的元素,但是不同元素的分数可以相同。

5.1 常用命令

5.1.1 添加、查询

zadd key score1 member1 score2 member2向有序集合添加一个或多个成员,或者更新已存在成员的分数

zrange key start stop [WITHSCORES]通过索引区间返回有序集合成指定区间内的成员

zrangebyscore key min max [WITHSCORES] [LIMIT]通过分数返回有序集合指定区间内的成员

zcount key min max计算在有序集合中指定区间分数的成员数

127.0.0.1:6379> zadd scores 70 tom
(integer) 1
127.0.0.1:6379> zadd scores 80 lucy 85 lily
(integer) 2
127.0.0.1:6379> zrange scores 0 -1
1) "tom"
2) "lucy"
3) "lily"
127.0.0.1:6379> zrange scores 0 -1 withscores
1) "tom"
2) "70"
3) "lucy"
4) "80"
5) "lily"
6) "85"
127.0.0.1:6379> zrangebyscore scores 70 85 withscores
1) "tom"
2) "70"
3) "lucy"
4) "80"
5) "lily"
6) "85"
127.0.0.1:6379> zrangebyscore scores -inf 80 withscores  #负无穷到80
1) "tom"
2) "70"
3) "lucy"
4) "80"
127.0.0.1:6379> zrangebyscore scores 80 +inf withscores  #80到正无穷
1) "lucy"
2) "80"
3) "lily"
4) "85"
127.0.0.1:6379> zcount scores 70 80
(integer) 2

5.1.2 排序、成员值的更新

zrevrange key start stop [WITHSCORES]返回有序集中指定区间内的成员,由大到小

zrevrangebyscore key max min [WITHSCORES]返回有序集中指定分数区间内的成员,分数由大到小

zrank key member 返回有序集合中指定成员的索引

zscore key member 返回有序集中,成员的分数值

zincrby key increment member有序集合中对指定成员的分数加上增量 increment

zcard key获取有序集合的成员数

zrem key member [member...]移除有序集合中的一个或多个成员

127.0.0.1:6379> zrevrange scores 0 -1 withscores
 1) "jery"
 2) "90"
 3) "dady"
 4) "88"
 5) "lily"
 6) "85"
 7) "lucy"
 8) "80"
 9) "tom"
10) "70"
127.0.0.1:6379> zrevrangebyscore scores 88 80
1) "dady"
2) "lily"
3) "lucy"
127.0.0.1:6379> zrank scores tom
(integer) 0
127.0.0.1:6379> zscore scores lucy
"80"
127.0.0.1:6379> zincrby scores 5 lucy
"85"
127.0.0.1:6379> zcard scores
(integer) 5
127.0.0.1:6379> zrem scores jery
(integer) 1

5.1.3 交集

zunionstore destination numkeys key [key ...]计算给定的一个或多个有序集的并集,并将结果存储在新的 key 中文章来源地址https://www.toymoban.com/news/detail-418591.html

127.0.0.1:6379> zunionstore newscores 2 scores scores1 aggregate max
(integer) 5
127.0.0.1:6379> zrange newscores 0 -1 withscores
 1) "das"
 2) "56"
 3) "tom"
 4) "70"
 5) "lily"
 6) "85"
 7) "lucy"
 8) "85"
 9) "dady"
10) "88"

5.2 使用场景

  • 排行榜:根据文章或帖子的点赞数、评论数、浏览量等的权重来统计
    • 命令zrevrange key 0 -1
  • 延时队列:轮询集合中的数据,根据分数判断是否超时,若超时则做出处理并移除数据
    • 命令:zrange key 0 0 , zremrangebyrank key 0 0 / zpopmin

到了这里,关于【Redis高手修炼之路】②Redis的五大数据类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Redis】五大数据类型(操作命令)

    🚩Redis 键(key) 这些是 Redis 数据库中的命令,用于对数据类型进行操作和管理。以下是每个命令的含义和用法: DEL:删除一个或多个键。 DUMP:将一个键的值转储到一个字符串中。 EXPIRE:设置键的过期时间。 EXPIREAT:在给定的时间戳之后为键设置过期时间。 KEYS:返回匹配给

    2024年02月13日
    浏览(53)
  • Redis(二)—— 五大基本数据类型和三大特殊数据类型

    1、常用命令  批量操作: redis可以定义对象  方式(一) :以JSON格式(其实就是key-value格式)保存一个对象 方式(二) : 把对象的两个属性定义成两个key 注意,如果采用第一种方式,那么无法单独取出字段哦~ 2、使用场景 数字int类型的string作为计数器,比如统计文章的

    2024年02月15日
    浏览(27)
  • Redis五大数据类型以及相关操作

    keys * 查看当前库的所有键 exists key 判断某个键是否存在 type key 查看键的类型 del key 删除某个键 expire key seconds 为键值设置过期时间,单位秒 ttl key 查看还有多久过期,-1表示永不过期,-2表示已过期 dbsize 查看当前数据库中key的数量 flushdb 清空当前库 Flushall 通杀全部库 String类型

    2024年02月02日
    浏览(26)
  • Redis的五大数据类型的数据结构

      Redis底层有六种数据类型包括: 简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组 。这六种数据结构五大数据类型关系如下: String:简单动态字符串 List:双向链表、压缩列表 Hash:压缩列表、哈希表 Sorted Set:压缩列表、跳表 Set:哈希表、整数数组   

    2024年02月11日
    浏览(30)
  • Redis的五大数据类型及其使用场景

    redis是一个非常快速‎‎的非关系数据库‎‎解决方案。其简单的键值数据模型使 Redis 能够处理大型数据集,同时保持令人印象深刻的读写速度和可用性。‎redis提供了五种数据类型,分别是是:1、string(字符串);2、hash(哈希);3、list(列表);4、set(集合);5、sor

    2024年02月16日
    浏览(29)
  • 浅谈Redis的五大数据类型及其应用

            Redis是一种开源的内存数据结构存储系统,它支持多种数据类型,包括字符串String、列表list、集合、哈希表和有序集合。这些数据类型在Redis中有着广泛的应用场景,可以满足不同的业务需求。本文将介绍Redis的五大数据类型及其应用。 常用命令:     最常用:

    2024年02月06日
    浏览(31)
  • Redis五大基本数据类型及其使用场景

    Nosql = not only sql(不仅仅是SQL) 关系型数据库:列+行,同一个表下数据的结构是一样的。 非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展。 NoSQL泛指非关系型数据库,随着web2.0互联网的诞生,传统的关系型数据库很难对付web2.0大数据时代!尤其是超大规

    2024年02月12日
    浏览(27)
  • redis 字符串类型常用场景以及相关示例

    可以先看一下系列第一篇文章 字符串可以用作缓存键值对的存储方式。通过将经常使用的数据存储为字符串,可以提高读取速度,并减少数据库等后端系统的负载 数据库查询结果的缓存 场景 频繁读取相同数据 当某个数据被频繁地读取,而且这些读取操作对应的数据库查询

    2024年02月16日
    浏览(25)
  • 系列六、Redis中的五大数据类型及相关操作

            Redis中的五大数据类型是指:String、List、Set、ZSet、hash。         Redis中的List类型,类似于Java中的List集合,其特点是:元素有序 且 可以重复。           Redis中的Set类型,类似于Java中的Set集合,其特点是:元素无序且不可以重复。         可排序的不可重复的

    2024年02月13日
    浏览(31)
  • 【Redis】1、学习 Redis 的五大基本数据类型【String、Hash、List、Set、SortedSet】

    🍀 Redis 诞生于2009年,全称是 Re mote D ictionary S erver,远程字典服务器,是一个基于 内存的键值型 NoSQL 数据库 🍀 键值(key-value)型,value 支持多种不同数据结构,功能丰富 🍀 单线程,每个命令具备 原子性 🍀 低延迟,速度快(基于内存、IO 多路复用、良好的编码) 🍀支

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包