Redis有五种基础的数据结构
- string(字符串)
- list(列表)
- hash(字典)
- set(集合)
- zset(有序列表)
1、string(字符串)
- string是redis最基本的数据结构,可以理解成与Memcached一模一样的类型,一个key对应一个value
- Redis中字符串是一种动态字符串,是可以修改字符串,内部结构的实现类似于java的ArrayList
- 一个redis中字符串value最多可以是512M
键值对:类似于hash当中的key 和 value,通过set和get来设置和获取字符串值 如果当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视频 b站: 尚硅谷周阳老师