Redis常用五大数据类型

Redis键(Key)

keys *查看当前库中所有key
exists key判断某个key是否存在
type key查看key的类型
del key删除指定的key数据
unlink key 根据value选择非阻塞删除;仅将keys从keyspace元数据中删除,真正的删除会在后续异步删除
expire key 10 :为给定的key设置过期时间为10秒
ttl key查看还有多少秒过期,-2则表示已经过期,-1表示永不过期

数据库操作

select 命令切换库
dbsize查看当前数据库中key的数量
flushdb清空当前库
flushall通杀全部库

Redis字符串(String)

String是Redis最基本的数据类型

String是二进制安全的。意味着Redis的Stirng可以包含任何数据。比如jpg图片和序列化对象

一个Redis字符串value最多可以使512M

常用命令
set 添加键值对
get key查询对应的键值
append 将给定的value追加到原值的末尾
strlen 获得值value的长度
setnx 只有当key不存在时,设置key的值
incr 将key中存储的value数字值+1,只能对数字操作
decr 将key中存储的数字值-1
incrby/decrby <步长>将key中存储的数字增减。自定义步长
mset 同时设置一个或多个键值对
mget 同时获取一个或多个value
msetnx …同时设置一个或多个键值对,当且仅当所有给定的key都不存在。原子性,有一个都失败
getrange <起始位置><结束位置>,获得值的范围,类似于java中的substring
setrange <起始位置>
setex <过期时间>设置键值的同时,设置过期时间,单位秒
getset 以旧换新,设置新值同时获得旧值

原子性:
原值操作是指不会被线程调度机制打断的操作;
这种操作一旦开始,就一直运行到结束,中间不会有任何context switch(切换到另一个线程)
(1)在单线程中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只能发生在指令之间
(2)在多线程中,不能被其他线程打断的操作就叫做原子操作,Redis单命令的原子性主要得益于Redis的单线程

java中的i++是否为原子操作?不是
i=0;两个线程分别对i进行++100,值是多少??2~200
Redis常用五大数据类型_第1张图片

String的数据结构:

String的数据结构为简单动态字符串。是可以修改的字符串,内部结构类似于Java中的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配
长度扩容规则:
当前字符串实际分配的空间都要高于实际字符串长度len。
当字符串长度小于1M时,扩容都是加倍现在的空间;
当字符串长度大于1M时,扩容只会多扩容1M。
字符串的自大长度为512M

Redis列表(List)

单键多值

介绍
Redis列表是简单字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头或则尾
它的底层是一个双向链表,对两端操作的性能很高,通过索引下标操作中间节点的性能很差
在这里插入图片描述

常用命令
lpush/rpush 从key的左边或者右边插入多个值
lpop/rpop 从key的左边或者右边吐出一个值。值在键在,值光键亡
rpoplpush 从key1列表右边吐出一个值,插入到列表左边
lrange 按照索引下标获得元素;lrange key 0 -1获取所有值
lindex 按照索引下标获得元素(从左到右)
llen 获得列表长度
Redis常用五大数据类型_第2张图片

数据结构
Redis常用五大数据类型_第3张图片

Redis集合(Set)

简介
set对外提供的功能与list类似是一个列表的功能。特殊在于set可以自动排重。当需要保存一个list数据时,又不希望list里的元素重复时,则set是一个很好的选择;并且set提供了判断某个成员是否在set中的一个接口,这是list不能提供的。
Redis的set是String类型的无序集合,它的底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都为O(1);

命令集合:

Redis常用五大数据类型_第4张图片Redis常用五大数据类型_第5张图片

数据结构:

set数据结构是dict字典,字典使用hash表实现的
Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象
Redis中set结构也是一样的,内部使用的是hash结构,所有的value都指向同一个对象

Redis哈希(Hash)

简介:

hash是一个键值对集合
Redis hash是一个string类型的field和value的映射表,hash最适合用来存储对象。类似java里面的Map
Redis常用五大数据类型_第6张图片
第一种:通过序列化或则转换成json格式进行保存,下次修改时,需要反序列化为对象,修改再转回去。修改操作麻烦
第二种,保存后数据过于冗余
第三种,采用hash存储,不存在重复存储数据,也不会带来序列化和并发修改的问题

常用命令:

Redis常用五大数据类型_第7张图片

数据结构:

Hash类型对应的数据类型是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable

Redis有序集合Zset(sorted set)

简介:

zset与普通集合set非常相似,是一个没有重复元素的字符串集合
Redis常用五大数据类型_第8张图片

常用命令:

Redis常用五大数据类型_第9张图片
Redis常用五大数据类型_第10张图片

数据结构:

SortSet(zset)一方面它等价于Java的Map,可以给每个元素赋一个权重值;另一方面又类似于TreeSet,内部元素会按照score进行排序,可以得到每个元素的名次
Zset底层使用了两个数据结构
1)hash,hash的作用是关联元素value和权重score,保障value的唯一性,可以通过元素value找到对应的score值
2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表

跳跃表

简介:

有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。

实例:

对比有序链表和跳跃表,从链表中查询出51

(1)有序链表
要查找值为51的元素,需要从第一个元素开始依次查找、比较才能找到。共需要6次比较。
在这里插入图片描述
(2)跳跃表
Redis常用五大数据类型_第11张图片
从第2层开始,1节点比51节点小,向后比较。
21节点比51节点小,继续向后比较,后面就是NULL了,所以从21节点向下到第1层
在第1层,41节点比51节点小,继续向后,61节点比51节点大,所以从41向下
在第0层,51节点为要查找的节点,节点被找到,共查找4次。

从此可以看出跳跃表比有序链表效率要高

你可能感兴趣的:(redis,redis,缓存,数据库)