Redis的基本数据类型及运用场景

た 入场券 2022-11-27 07:10 307阅读 0赞

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/

发表评论

表情:
评论列表 (有 0 条评论,307人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis基本数据类型和API运用

    一、序言 Redis是一个基于内存亦可持久化的日志型数据结构存储,基于RESP协议进行通讯,可用于数据库、缓存和消息队列。协议简单,数据在内存中进行操作同时又是单线程运行