NoSQL 数据库案例实战 --Redis 数据类型详解(String、Hash、List、Sets、Sorted-Sets)
发布日期:2021-06-28 20:06:09 浏览次数:2 分类:技术文章

本文共 6382 字,大约阅读时间需要 21 分钟。

Redis 数据类型详解(String、Hash、List、Sets、Sorted-Sets)

前言

本环境是基于 Centos 7.8 系统构建Redis学习环境

具体构建,请参考

Redis 作为基于内存的数据库,同样设置与很多数据类型。例如:字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。接下来我们将详细介绍Redis的数据类型。


一、String

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或lson对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M

原子性单操作

# 判断指定字符串是否存在192.168.5.5:6379> exists sk3(integer) 0# 向指定字符串插入字符192.168.5.5:6379> append sk3 'hello world'(integer) 11# 向指定字符串追加字符192.168.5.5:6379> append sk3 123(integer) 14# 返回字符串的长度192.168.5.5:6379> strlen sk1(integer) 11# 覆盖原有的字符串192.168.5.5:6379> set sk3 10OK# 自增1192.168.5.5:6379> incr sk3(integer) 11# 自减1192.168.5.5:6379> decr sk3(integer) 10# 自增指定的步长192.168.5.5:6379> incrby sk3 10(integer) 20# 自减指定的步长192.168.5.5:6379> decrby sk3 10(integer) 10# 查看字符串的内容192.168.5.5:6379> get sk3"10"

原子性双操作

# 存储指定的值,返回原有的值192.168.5.5:6379> getset sk3 50"10"192.168.5.5:6379> getset sk3 50"50"192.168.5.5:6379> getset sk4 80(nil)# 定义字符串是,指定字符串的生存时间192.168.5.5:6379> setex sk4 10 8OK192.168.5.5:6379> get sk4"8"192.168.5.5:6379> get sk4(nil)# 查看字符串的生存时间(-1不过期,-2过期)192.168.5.5:6379> ttl sk4(integer) -2192.168.5.5:6379> ttl sk1(integer) -1# 给没有值得字符串设置字符192.168.5.12:6379> exists sk4(integer) 0192.168.5.12:6379> setnx sk4 'nihao'(integer) 1192.168.5.12:6379> setnx sk2 'hello'(integer) 0192.168.5.12:6379> get sk2"12"192.168.5.12:6379> get sk4"nihao"# 替换指定的字符串192.168.5.12:6379> set sk1 'hello world'OK192.168.5.12:6379> setrange sk1 0 nihao(integer) 11192.168.5.12:6379> get sk1"nihao world"# 截取指定的字符串192.168.5.12:6379> set sk1 '012345678'OK192.168.5.12:6379> getrange sk1 2 5"2345"# 设定多个字符串192.168.5.12:6379> mset ck1 1 ck2 2OK# 查看多个字符串192.168.5.12:6379> mget ck1 ck21) "1"2) "2"# 多个字符串不存在,再设置值192.168.5.12:6379> msetnx ck3 3 ck4 4 ck5 5(integer) 1# 查看多个字符串的值192.168.5.12:6379> mget ck3 ck4 ck51) "3"2) "4"3) "5"

二、Hash

我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。

原子性单操作

# 查看哈希值是否存在192.168.5.12:6379> hexists hk1 1(integer) 0# 设定哈希值192.168.5.5:6379> hset hk1 f1 'a'(integer) 1192.168.5.5:6379> hset hk1 f2 'b'(integer) 1# 获取哈希值对应字段的值192.168.5.5:6379> hget hk1 f1"a"192.168.5.5:6379> hget hk1 f2"b"# 查看指定哈希值是否存在192.168.5.5:6379> hexists hk1 f1(integer) 1# 返回哈希值的字段数192.168.5.5:6379> hlen hk1(integer) 2# 设定哈希值空字段的值192.168.5.12:6379> hsetnx hk1 f1 'c'(integer) 1192.168.5.12:6379> hget hk1 f1"c"# 查看哈希值的长度192.168.5.5:6379> hlen hk1(integer) 3

原子性双操作

# 一行设置多个字段的哈希值192.168.5.5:6379> hmset hk2 f1 'a' f2 'b' f3 'c'OK# 批量查看哈希值192.168.5.5:6379> hmget hk2 f1 f2 f31) "a"2) "b"3) "c"# 查看哈希所有的值192.168.5.5:6379> hvals hk21) "b"2) "a"3) "c"# 自增指定的长度192.168.5.5:6379> hincrby hk1 f1 10(integer) 11192.168.5.5:6379> hget hk1 f1"11"# 获取哈希值所有的键值对192.168.5.5:6379> hgetall hk11) "f1"2) "11"3) "f2"4) "2"5) "f3"6) "c"# 获取所有的键192.168.5.5:6379> hkeys hk11) "f1"2) "f2"3) "f3"

三、List

在Redis中,List类型是的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。

# 列表中插入元素 192.168.5.5:6379> lpush key_noe 1 2 3 4 5(integer) 5192.168.5.5:6379> rpush key_two a b c d e(integer) 5# 读取列表中的元素192.168.5.5:6379> lrange key_noe 0 -11) "5"2) "4"3) "3"4) "2"5) "1"192.168.5.5:6379> lrange key_two 0 -11) "a"2) "b"3) "c"4) "d"5) "e"# 当key存在时,插入值192.168.5.5:6379> lpushx key_noe a b(integer) 12# 查看列表长度192.168.5.5:6379> llen key_two(integer) 5# 弹出栈底的元素192.168.5.5:6379> lpop key_two"a"# 弹出栈底 的元素192.168.5.5:6379> lpop key_two"a"# 按照指定的顺序和个数删除元素192.168.5.12:6379> lpush kk1 a b c d a b c d a b c d# 从头到尾删除192.168.5.12:6379> lrem kk1 2 d# 从未到头删除192.168.5.12:6379> lrem kk1 -2 a# 删除所有匹配到的元素192.168.5.12:6379> lrem kk1 0 b# 第一个值替换192.168.5.5:6379> lset key_one 0 abOK# 在d之前插入元素192.168.5.12:6379> linsert kk2 before d xing# 在d之后插入元素192.168.5.12:6379> linsert kk2 after d ming# 按照索引,取值192.168.5.5:6379> lindex key_one 0"ab"# 按照索引删除元素,按照压栈顺序删除192.168.5.5:6379> ltrim key_two 0 2OK# 插入元素192.168.5.5:6379> rpush rk1 a b c d e(integer) 5# 读取元素192.168.5.5:6379> lrange rk1 0 -11) "a"2) "b"3) "c"4) "d"5) "e"

四、Sets

在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作,Set可包含的最大元素数量是4294967295。如果多次添加相同元素,Set 中将仅保留该元素的一份拷贝。

和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如 unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。

Sets特点

  • 无序性:集合里面数据是没顺序区分。
  • 确定性:集合里面数据个数是确定的。
  • 唯一性:集合里面数据不能彼此重复。
# 插入数据到lk1192.168.5.12:6379> sadd lk1 a b c d (integer) 4# 查看集合lk1的数据192.168.5.12:6379> smembers lk11) "d"2) "b"3) "a"4) "c"# 查看元素b是否在lk1中192.168.5.12:6379> sismember lk1 b(integer) 1# 查看lk1元素的个数192.168.5.12:6379> scard lk1(integer) 4# 随机显示lk1中的元素192.168.5.12:6379> srandmember lk1"c"# 弹出lk1中的元素192.168.5.12:6379> spop lk1"d"# 删除lk1中指定的元素192.168.5.12:6379> srem lk1 b c(integer) 2# 移动元素192.168.5.12:6379> smove lk1 lk12 a(integer) 1# 求差集192.168.5.12:6379> sadd s1 a b c d e (integer) 5192.168.5.12:6379> sadd s2 b(integer) 1192.168.5.12:6379> sadd s3 b c d (integer) 3192.168.5.12:6379> sdiff s1 s21) "c"2) "e"3) "d"4) "a"192.168.5.12:6379> sdiff s3 s21) "c"2) "d"# 将差集插入s4中192.168.5.12:6379> sdiffstore s4 s1 s2(integer) 4192.168.5.12:6379> smembers s41) "c"2) "e"3) "d"4) "a"# 求交集192.168.5.12:6379> sinter s1 s2 s31) "b"# 将交集插入s5中192.168.5.12:6379> sinterstore s5 s1 s2 s3(integer) 1192.168.5.12:6379> smembers s51) "b"# 求并集192.168.5.12:6379> sunion s2 s31) "c"2) "b"3) "d"# 将并集插入s6中192.168.5.12:6379> sunionstore s6 s2 s3(integer) 3192.168.5.12:6379> smembers s61) "c"2) "b"3) "d"

五、Sorted-Sets

Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的,也是有序的。

事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis同样的高效,在其它数据库中进行建模是非常困难的。

Zsets特点

  • 唯一性:集合里面数据是唯一的。
  • 有序性:集合里面数据是有顺序的。
  • 重复性:集合里面数据是可以重复的。
# 添加元素到zsets192.168.5.12:6379> zadd zk1 1 'one' 2 'two' 3 'three'(integer) 3# 添加分数一致的成员192.168.5.12:6379> zadd zk3 1 a 1 b 1 c(integer) 3192.168.5.12:6379> zrange zk3 0 -1 withscores1) "a"2) "1"3) "b"4) "1"5) "c"6) "1"# 查看zsets中的元素个数192.168.5.12:6379> zcard zk1(integer) 3# 返回zk1的键和值(按照分数从小到大排序)192.168.5.12:6379> zrange zk1 0 -1 withscores1) "one"2) "1"3) "two"4) "2"5) "three"6) "3"# 返回zk1的索引(从零开始计数)192.168.5.12:6379> zrank zk1 two(integer) 1# 返回满足score在1--2 之间的元素个数192.168.5.12:6379> zcount zk1 1 2(integer) 2# 删除成员192.168.5.12:6379> zrem zk1 three two(integer) 2# 查看成员对应的分数192.168.5.12:6379> zscore zk1 one"1"# 成员分数加5192.168.5.12:6379> zincrby zk1 5 one"6"

转载地址:https://blog.csdn.net/XY0918ZWQ/article/details/112390342 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:数据库系统常用的数据模型
下一篇:NoSQL 数据库案例实战 --Redis 环境部署

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月17日 16时40分12秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章