Redis五大数据类型

Redis有五种基础的数据结构

  • string(字符串)
  • list(列表)
  • hash(字典)
  • set(集合)
  • zset(有序列表)

1、string(字符串)

  • string是redis最基本的数据结构,可以理解成与Memcached一模一样的类型,一个key对应一个value
  • Redis中字符串是一种动态字符串,是可以修改字符串,内部结构的实现类似于java的ArrayList
  • 一个redis中字符串value最多可以是512M

键值对:类似于hash当中的key 和 value,通过setget来设置和获取字符串值 如果当key存在时 ,set命令会将原来的设置的值覆盖。

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> set k1 v11
OK
127.0.0.1:6379> get k1
"v11"

可以通过exists来查询是否存在键值对,可以通过del来删除键值对

127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> DEL k1
(integer) 1
127.0.0.1:6379> get k1
(nil)

可以通过append命令将value的值追加到key现有值得末尾 若key不存在 则那就是简单的set命令。strlen命令返回键 key 储存的字符串值的长度

127.0.0.1:6379> set k2 hello
OK
127.0.0.1:6379> get k2
"hello"
127.0.0.1:6379> append k2 world #在k2值后面进行追加
(integer) 10
127.0.0.1:6379> get k2
"helloworld"
127.0.0.1:6379> strlen k2
(integer) 10 #当前字符串的长度

批量设置键值对:可以对多个字符串进行批量读写,可以节省网络耗时开销

127.0.0.1:6379> keys *
1) "k4"
2) "k3"
3) "k1"
4) "k2"
127.0.0.1:6379> mget k1 k2 k3 k4 #返回一个列表
1) "v1"
2) "helloworld"
3) "v3"
4) "v4"
127.0.0.1:6379> mset k1 v11 k2 hello k3 v33 k4 v44
OK
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v11"
2) "hello"
3) "v33"
4) "v44"

过期和set命令开展:可以对key设置时间,到时间后会被自动删除,一般这个功能用来控制缓存失效时间。

127.0.0.1:6379> set k5 value5
OK
127.0.0.1:6379> get v5
(nil)
127.0.0.1:6379> EXPIRE k5 5 #设置五秒后过期
(integer) 1
127.0.0.1:6379> get v5 #经过五秒以后
(nil)

127.0.0.1:6379> SETEX k6 5 v6 #等价于set+expire 五秒后过期
OK
127.0.0.1:6379> get k6 #时间还没过五秒 还可以得到v6
"v6"
127.0.0.1:6379> get k6 #五秒之后
(nil)
127.0.0.1:6379> setnx k1 v111  #当key存在时 不成功
(integer) 0
127.0.0.1:6379> get k1
"v11"
127.0.0.1:6379> setnx k8 v8    #当key不存在是,成功
(integer) 1
127.0.0.1:6379> get k8
"v8"

计数:如果value值是一个整数,可以通过INCR命令进行原子性的自增操作。注意自增有范围的,不能超过这个范围

127.0.0.1:6379> set age 19
OK
127.0.0.1:6379> incr age #自增
(integer) 20
127.0.0.1:6379> incrby age 5
(integer) 25
127.0.0.1:6379> incrby age -6
(integer) 19

getrange/setrange:获取指定区间范围内的值/设置指定区间范围内的值

127.0.0.1:6379> get age
"19"
127.0.0.1:6379> set k9 abcdefghjgk
OK
127.0.0.1:6379> getrange k9 0 -1 #-1表示最后一个字符
"abcdefghjgk"
127.0.0.1:6379> getrange k9 0 2 #第一个数字表示最开始的字符,后面一个表示你要截取的最后一个字符的位置 
"abc"

返回原值的GETSET命令:先get 后set

127.0.0.1:6379> set k11 v1111
OK
127.0.0.1:6379> GETSET k11 v2222
"v1111"
127.0.0.1:6379> get k11
"v2222"

2、list(列表)

  • Redis的列表相当于java当中的LinkedList
  • 底层实际上是一个链表
  • 插入和删除操作十分快
  • 当列表弹出了最后一个元素之后,该数据结构被自动删除,内存被回收

链表的基本操作

  • LPUSH 和 RPUSH 分别可以向 list 的左边(头部)和右边(尾部)添加一个新元素;
  • LRANGE 命令可以从 list 中取出一定范围的元素;
  • LINDEX 命令可以从 list 中取出指定下表的元素,相当于 Java 链表操作中的 get(int index) 操作;

队列:先进先出

127.0.0.1:6379> rpush books python java golang
(integer) 3
127.0.0.1:6379> llen books
(integer) 3
127.0.0.1:6379> lpop books
"python"
127.0.0.1:6379> lpop books
"java"
127.0.0.1:6379> lpop books
"golang"
127.0.0.1:6379> lpop books
(nil)

栈:先进后出

127.0.0.1:6379> rpush books python java golang
(integer) 3
127.0.0.1:6379> rpop books
"golang"
127.0.0.1:6379> rpop books
"java"
127.0.0.1:6379> rpop books
"python"
127.0.0.1:6379> rpop books
(nil)

lindex命令:类型于java链表的get(int index)操作

127.0.0.1:6379> rpush books python java golang
(integer) 3
127.0.0.1:6379> lindex books 2
"golang"
127.0.0.1:6379> lindex books 1
"java"

3、hash(字典)

  • Redis的字典相当于java中的HashMap
  • 结构为:数组+链表的二维结构
  • 适合用于存储对象
  • hash中的值只能为字符串
  • KV模式不变,但V是一个键值对
  • 当hash移除了最后一个元素之后,该数据结构被自动删除,内存被回收

渐进式rehash: 渐进式rehash会在rehash的同时,保留新旧两个hash结构。查询时会同时查询两个hash结构,然后在后续的定时任务以及hash操作指令中,循序渐进的把旧字典的内容迁移到新的字典中,当搬迁完成了,就会使用新的hash结构取代。

在这里插入图片描述

127.0.0.1:6379> hset hash k1 v1
(integer) 1
127.0.0.1:6379> hget hash k1
"v1"
127.0.0.1:6379> hset hash k2 v2
(integer) 1
127.0.0.1:6379> hgetall hash 
1) "k1"
2) "v1"
3) "k2"
4) "v2"
127.0.0.1:6379> hset hash k1 v11 #更新操作 返回0
(integer) 0
127.0.0.1:6379> hmset hash1 id 1102 name lihua age 16 #批量操作
OK
127.0.0.1:6379> hmget hash1 id name age
1) "1102"
2) "lihua"
3) "16"
127.0.0.1:6379> hset user age 29
(integer) 1
127.0.0.1:6379> hincrby user age 1
(integer) 30
127.0.0.1:6379> 

4、set(集合)

  • Redis中的集合相当于Java中的HashSet
  • 内部键值对是无序的、唯一的
127.0.0.1:6379> sadd A a1 #添加单个元素
(integer) 1
127.0.0.1:6379> sadd A a11
(integer) 1
127.0.0.1:6379> sadd A  #添加重复元素
(integer) 0
127.0.0.1:6379> sadd A a12 a13 #添加多个元素
(integer) 2
127.0.0.1:6379> smembers A
1) "a13"
2) "a12"
3) "a11"
4) "a1"
127.0.0.1:6379> sismember A a1 #查询a1是否存在
(integer) 1
127.0.0.1:6379> sismember A a2 
(integer) 0 #不存在 返回0
127.0.0.1:6379> scard A #返回集合中元素
(integer) 4
127.0.0.1:6379> spop A #随机移除一个元素
"a12"

5、zset(有序列表)

  • 在set基础上,加一个score值。之前set是k1 v1 v2 v3,现在zset是k1 score1 v1 score2 v2
  • 类型于java的SortedSet 和 HashMap的结合体
  • 一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以为每个 value 赋予一个 score 值,用来代表排序的权重。
  • 内部实现用的是一种叫做【跳跃表】的数据结构

在这里插入图片描述

在这里插入图片描述

127.0.0.1:6379> zadd Tom 98.0 chinexe
(integer) 1
127.0.0.1:6379> zadd Tom 90.0 english
(integer) 1
127.0.0.1:6379> zadd Tom 120.0 math
(integer) 1
127.0.0.1:6379> zrange Tom 0 -1
1) "english"
2) "chinexe"
3) "math"
127.0.0.1:6379> zrevrange Tom 0 -1
1) "math"
2) "chinexe"
3) "english"
127.0.0.1:6379> zcard Tom
(integer) 3

redis命令参考

荐学习redis视频 b站: 尚硅谷周阳老师

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SC_IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值