参考课程:https://www.bilibili.com/video/BV1Rv41177Af
参考书:https://blog.csdn.net/liu8490631/article/details/124290851
Docker 打开 redis-server,然后通过命令进入 redis 容器:
docker exec -it myredis /bin/bash
连接 redis:
redis-cli
set key value
设置 key 以及对应的 value
setns key value
只有当 key 不存在时才设置 key 的值,否则不生效
get key
获取指定 key 对应的的 value
keys
查看当前库所有 key
exists key
判断某个 key 是否存在
type key
判断 key 的数据类型,若不存在 key,返回 none
del key
删除 key
★ unlink key
根据 value 选择非阻塞删除,仅将 key 从 keyspace 元数据中删除,真正的删除会在后续异步操作。(逻辑删除)
expire key 10
为给定的 key 设置过期时间,这里的 10 为 10 秒钟
ttl key
查看 key 还有多少秒过期,-1 表示永不过期,-2 表示已过期
select [n]
切换数据库,共 16 个, 默认为 0
dbsize
查看当前数据 key 的数量
flushdb
清空当前库的 key
flushall
清空所有库的 key
mset key1 value1 key2 value2 ...
设置一个或多个 key-value 对mget key1 key2 ...
获取一个或多个valuemsetnx key1 value1 key2 value2
同时设置一个或者多个 key-value 对,当且仅当所有给定 key 都不存在,才执行成功,若其中有一个 key 已经存在,则其他都不成功Redis 最基本的数据类型,value 最大可以是 512M
。
String 类型是二进制安全的,可以包含任何数据,比如 jpg 图片或者序列化对象。
append key value
将给定的 value 追加到原值的末尾,若没有 key 则创建 key,并写入给定 valuestrlen key
获得值的长度,若 key 不存在,则返回 0incr key
对存储的数字值增加 1,若 key 不存在,新增 key,value 为 1decr key
对存储的数字值减少 1,若 key 不存在,新增 key,value 为 -1incrby key 10
和 decrby key 10
和上面的用法一致,每次加 10 或减10范围:
getrange key 起始位置 结束位置
取子串,前包后包setrange key 起始位置 value
从索引位置用 value 代替从 索引位置 开始的 value 长度的子串setex key 过期时间 value
设置键值的同时,设置过期时间,单位秒getset key value
以新换旧并返回旧的值简单动态字符串,可修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
当字符串小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。字符串最大长度为 512M。
单键多值。
Redis 的列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
底层结构是 双向链表,对两端操作性高,通过索引下标操作中间节点性能较差。
lpush/rpush key value1 value2 ...
从左边/右遍插入一个或者多个值lpop/rpop key count
从左边/右遍吐出 count 个值。值在键在,值光键亡。count 可省,默认吐一个。rpoplpush key1 key2
从 key1 列表右边吐出一个值,插到 key2 列表的左边。lrange key start stop
按照索引下标获得元素(从左到右),stop 若为 -1,则代表取全部值。lindex key index
列表对应下标的值llen key
取列表长度List 的数据结构为快速链表 quickList。
列表元素比较少的时候会使用一块连续的内存存储,这个空间是 ziplist,也即是压缩列表。压缩链表将所有的元素紧挨着一起存储,分配的是一块连续的内存。
当数据较多时才会改成 quickList。因为普通的链表需要附加指针空间太大,比较浪费空间。
Redis 用多个压缩链表组成快速链表。将多个压缩链表使用双指针串起来使用,这样既满足了快速的插入删除性能,也不会出现太大的空间冗余。
Redis 中的 Set 对外提供的功能与 List 类似,特殊之处在于 Set 可以自动排重,当你需要存储一个列表数据,又不希望出现重复数据,Set 是一个很好的选择
Set 提供了判断某个成员是否在一个 Set 集合内的重要接口,这个也是 List 所不能提供的。
Redis 的 Set 是 String 类型的无序集合。底层其实是一个 value 为 null 的 hash 表,所以添加,删除,查找操作都是 O(1)。
sadd key value1 value2...
添加一个或多个值smembers key
取出集合内所有的值sismember key value
判断集合中是否有 value 值,有返回 1,无返回 0scard key
返回该集合元素个数srem key value1 value2..
删除集合中某些元素spop key
随机从集合中吐出一个值sinter key1 key2
返回两个集合的交集元素sunion key1 key2
返回两个集合的并集元素sdiff key1 key2
返回 key1 - key2,差集 元素Set 数据结构是 dict 字典,用哈希表来实现。
Java 中的 HashSet 内部实现使用的是 HashMap,只不过所有的 value 都指向同一个对象。
Redis 中的 Set 结构也是一样,内部也使用 hash 结构,所有的 value 都指向同一个內部值。
Redis hash 是一个键值对集合。
hash 中一个 key 对应多个 field-value
值。
hash 特别适合用于存储对象,类似 Java 里面的 Map
hset key field value
赋值 field 为 valuehget key field
从 field 中取值hmset key filed1 value1 field2 value2...
批量设置 hashhexsts key field
查看 hash 中给定 field 是否存在hkeys key
查看 hash 中所有的fieldhvals key
查看 hash 中所有 valuehincrby key field increment
对 hash 中 field 中的值增加 incrementhsetnx key field value
当 hash 中 field 不存在时,增加 field,否则执行失败Hash 对应的数据结构有两种:zipList 压缩链表,hashTable 哈希表。
当 field-value 长度较短且个数较少时,使用压缩链表,否则使用哈希表。
Redis 有序集合 Zset 和普通集合 Set 非常相似,是一个没有重复元素的字符集合。
不同之处在于有序集合的每个成员都关联了一个评分(Score),这个评分被用来按照从最低到最高分的方式排序集合中的成员。集合成员是唯一的,但是评分是可以重复的。
因为元素是有序的,所以可以很快根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此能使用有序集合作为一个没有重复成员的智能列表。
zadd key score1 value1 score2 value2
将一个或多个成员元素以及 score 值加入到有序集 key 当中zrange key start stop [withscores]
返回有序集 key 中,下标在 start 到 stop 之间的元素,带 withsocres,可以让分数一起返回。zrangebyscore key min max [withscores] [limit offset count]
返回有序集 key 中,所有介于 min 和 max 之间(包含)的成员,按照 score 分数从小到大排序输出。zrevrangebyscore key max min [withscores] [limit offset count]
从大到小排序输出zincrby key increment value
为元素的 score 加上增量zrem key value
删除指定值的元素zcount key min max
统计集合中分数区间内的元素个数zrank key value
返回该值在集合中的排名,从 0 开始SortedSet(zset) 一方面等价于 Java 的数据结构 Map
底层使用了两个数据结构:
有序集合底层实现可以用数组,平衡树,链表等。
数组不方便元素的插入,删除;平衡树或红黑树效率高但是结构复杂;链表查询需要逐个遍历效率低。
Redis 采用的是跳跃表。跳表效率堪比红黑树,实现比红黑树简单。