Redis的基本数据类型及运用场景
Redis的基本数据类型及运用场景
文章目录
- Redis的基本数据类型及运用场景
- 简介
- String
- List
- Hash
- Set
- Zset
- 其他参考
简介
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
String
String是Redis最基本的数据类型,上面的简介中也说到Redis是用c语言开发的。但是Redis中的字符串和c语言中的字符串类型却是有明显的区别;
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
基本命令
命令 | 说明 | 案例 |
---|---|---|
set | 添加key-value | set username admin |
get | 根据key获取数据 | get username |
strlen | 获取key的长度 | strlen key |
exists | 判断key是否存在 | exists name 返回1存在 0不存在 |
del | 删除redis中的key | del key |
keys | 用于查询符合条件的key | keys 查询redis中全部的key;keys n?me 使用占位符获取数据;keys nam 获取nam开头的数据 |
mset | 赋值多个key-value | mset key1 value1 key2 value2 key3 value3 |
mget | 获取多个key的值 | mget key1 key2 |
append | 对某个key的值进行追加 | append key value |
type | 检查某个key的类型 | type key |
select | 切换redis数据库 | select 0-15 redis中共有16个数据库 |
flushdb | 清空单个数据库 | flushdb |
flushall | 清空全部数据库 | flushall |
incr | 自动加1 | incr key |
decr | 自动减1 | decr key |
incrby | 指定数值添加 | incrby 10 |
decrby | 指定数值减 decrby 10 | |
expire | 指定key的生效时间 单位秒 | expire key 20 key20秒后失效 |
pexpire | 指定key的失效时间 单位毫秒 | pexpire key 2000;key 2000毫秒后失效 |
ttl | 检查key的剩余存活时间 | ttl key |
persist | 撤销key的失效时间 | persist key |
setex(set with expire)键秒值
setex:设置带过期时间的key,动态设置。
setex 键 秒值 真实值
setnx(set if not exist)
setex(set with expire)键秒值/setnx(set if not exist)
**应用场景:**保证图片(Base64);统计粉丝数;包含用户信息
List
Redis中的List集合是双端循环列表,分别可以从左右两个方向插入数据.
底层实际是个链表
List集合可以当做队列使用,也可以当做栈使用
队列:存入数据的方向和获取数据的方向相反
栈:存入数据的方向和获取数据的方向相同
基本命令
命令 | 说明 | 案例 |
---|---|---|
lpush | 从队列的左边入队一个或多个元素 | LPUSH key value [value …] |
rpush | 从队列的右边入队一个或多个元素 | RPUSH key value [value …] |
lpop | 从队列的左端出队一个元素 | LPOP key |
rpop | 从队列的右端出队一个元素 | RPOP key |
lpushx | 当队列存在时从队列的左侧入队一个元素 | LPUSHX key value |
rpushx | 当队列存在时从队列的右侧入队一个元素 | RPUSHx key value |
lrange | 从列表中获取指定返回的元素 | LRANGE key start stop |
Lrange key 0 -1 | 获取全部队列的数据 | |
lrem | 从存于 key 的列表里移除前 count 次出现的值为 value 的元素 | |
Lset | 设置 index 位置的list元素的值为 value | LSET key index value |
性能总结
它是一个字符串链表,left、right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。
应用场景:阻塞队列
Hash
Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
类似Java里面的Map
Hash对象的实现方式有两种分别是ziplist、hashtable,其中hashtable的存储方式key是String类型的,value也是以key value的形式进行存储。
字典类型的底层就是hashtable实现的,明白了字典的底层实现原理也就是明白了hashtable的实现原理,hashtable的实现原理可以于HashMap的是底层原理相类比
例子:User对象{id:2,name:小明,age:19}
基本命令:
命令 | 说明 | 案例 |
---|---|---|
hset | 为对象添加数据 | hset key field value |
hget | 获取对象的属性值 | hget key field |
hexists | 判断对象的属性是否存在 | HEXISTS key field;1表示存在 0表示不存在 |
hdel | 删除hash中的属性 | hdel user field [field …] |
hgetall | 获取hash全部元素和值 | HGETALL key |
hkyes | 获取hash中的所有字段 | HKEYS key |
hlen | 获取hash中所有属性的数量 | hlen key |
hmget | 获取hash里面指定字段的值 | hmget key field [field …] |
hmset | 为hash的多个字段设定值 | hmset key field value [field value …] |
hsetnx | 设置hash的一个字段,只有当这个字段不存在时有效 | HSETNX key field value |
hstrlen | 获取hash中指定key的长度 | HSTRLEN key field |
hvals | 获取hash的所有值 | HVALS user |
Set
Set(集合)
Redis的Set是string类型的无序集合。它是通过HashTable实现实现的,
基本命令
命令 | 说明 |
---|---|
sadd key value | 向set添加元素 |
srem key value | 从set中移除元素 |
smembers key | 取出所有set元素 |
sismember key value | 查看value是否存在set中 |
sunion key1 key2 … keyn | 将所有key合并后取出来,相同的值只取一次 |
scard key | 获取set中元素的个数 |
srandmember key | return a random element from a set, without removing the element.随机取出一个 |
sdiff key1 key2 … keyn | 获取第一set中不存在后面几个set里的元素。 |
sdiffstore dstkey key1 key2 … keyn | 和sdiff相同,获取key1中不存在其他key里的元素,但要存储到dstkey中。 |
sinter key1 key2 … keyn | 取出这些set的交集 |
sinterstore dstkey key1 key2 … keyn | 取出这些key的交集并存储到dstkey |
smove srckey dstkey member | 将元素member从srckey中转移到dstkey中,这个操作是原子的。 |
应用场景:去重、抽奖、共同好友、二度好友
Zset
基本命令
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复
实现原理
与set无顺序存储不同,Zset按score顺序进行存储,这也是为什么基本操作都是O(log(N))复杂度。
Redis使用两种结构存储zset,在数据个数较少时使用ziplist,数量超出阈值时使用skiplist,阈值通过zset-max-ziplist-entries and zset-max-ziplist-value设置
redis zset内部实现
Redis Zset 实现原理
跳表(skiplist)的理解
命令 | 说明 |
---|---|
zadd key score member | 向有序set中添加元素member,其中score为分数,默认升序; |
zrange key start end [withscores] | 获取按score从低到高索引范围内的元素,索引可以是负数,-1表示最后一个,-2表示倒数第二个,即从后往前。withscores可选,表示获取包括分数。 |
zrevrange key start end [withscores] | 同上,但score从高到低排序。 |
zcount key min man | 获取score在min和max范围内的元素的个数 |
zcard key | 获取集合中元素的个数。 |
zincrby key increment member | 根据元素,score原子增加increment. |
zremrangebyscore key min max | 清空集合内的score位于min和max之间的元素。 |
zrank key member | 获取元素的索引(照score从低到高排列)。 |
zrem key member | 移除集合中的该元素 |
zscore key member | 获取该元素的score |
应用场景:排行榜前前10名的选手
其他参考
最详细的redis五种数据结构详解
https://juejin.im/post/6844904192042074126
Redis 和 I/O 多路复用
https://draveness.me/redis-io-multiplexing/
中文文档
http://www.redis.cn/
还没有评论,来说两句吧...