本文详细介绍了Redis。主要讲解其基础数据结构、高级数据结构、高级特性、使用场景等。有需要了解的朋友可以参考一下。
目录
Redis一、Redis的基本数据结构1。String)2。哈希)3。列表)4。设置)5。有序集合II。Redis 1的高级数据结构。超对数2。GEO3。位图三,Redis 1的高级特性。Redis交易2。发布和订阅。剧本4。Redis Stream 4。Redis使用场景1。业务数据缓存2。商业数据处理。全球一致计数4。高效的统计计数。发布、订阅和流式传输6。分布式锁5,Redis的Java客户端1。Jedis2。莴苣3。再版六。项目集成1。SpringMvc项目可以引入Spring数据redis2。SpringBoot访问(默认情况下使用莴苣)3。Spring缓存集成Redis nothing:
Redis
Redis是一个开源的(BSD许可的)内存数据结构存储,用作数据库、缓存和消息代理。Redis提供数据结构,如字符串、散列、列表、集合、带有范围查询的排序集合、位图、超级日志、地理空间索引和流。Redis内置复制、Lua脚本、LRU驱逐、事务和不同级别的磁盘持久化,并通过Redis Sentinel和Redis Cluster的自动分区提供高可用性。
一、Redis基本数据结构1. 字符串 (String)
Type是Redis中最基本的数据存储类型,在Redis中是二进制安全的,也就是说这种类型可以接受任何格式的数据,比如JPEG图像数据或者json对象描述信息。在Redis中,字符串类型值可以容纳的最大数据长度是512M。
常见命令:
设置键值设置值
获取键获取值
Getset设置给定值并返回旧值。
管理键1键2.获取一个或多个键的值。
Setnx key value设置键不存在时的值。
Incr key存储key的值1。
R by key increment将key存储的值与给定的增量值相加。
Decr key存储key -1的值。
Decrby key increment从key存储的值中减去给定的增量。
Rlenkey返回由key存储的字符串的长度。
注意:
1.字符串追加命令将使用更多的内存
2.整数分享:能使用整数的就尽量使用。
3.整数精度:redis可以保证16位精度,但是17-18位的大整数会失去精度。
2. 散列(hash)
Redis中的Hash类型可以看作是一个带有字符串键和字符串值的map容器。所以这种类型非常适合存储对象的信息。
常见命令:
hset关键字段值
hget关键字段
set hm key field 1 value 1[field 2 value 2]同时设置多个字段值。
hm获取关键字段1[字段2]
Hgetall key获取key的所有值。
Hincrby键字段增量将给定的增量值添加到指定键的字段中。
Hkeys键获取一个键的所有字段
获取一个键的所有值。
Hlen key获取哈希表中字段的数量。
Exists keyfield检查哈希表中的字段是否存在。
Hd key field1 [field2]删除一个或多个哈希表字段。
3. 列表(list)
在Redis中,列表类型是按插入顺序排序的字符串链表。就像数据库结构中常见的链表一样,可以在头部和尾部添加新元素。插入时,如果该键不存在,Redis将为该键创建一个新的链表。相反,如果链表中的所有元素都被删除,该键也将从数据库中删除。
常见命令:
Lpush key value1 [value2]将一个或多个值插入列表的开头。
Rpush key value1 [value2]在列表末尾插入一个或多个值。
Lrange键start stop获取列表指定范围内的元素。
Lpop键移出并获取列表中的第一个元素。
Rpop键移出并获取列表中的最后一个元素。
Blpop key1 [key2]超时阻碍移出并获取列表的第一个元素。如果没有元素,它将阻塞,直到超时或有元素。
Brpop key1 [key2]超时妨碍移出并获取列表的最后一个元素。如果没有元素,它将被阻塞,直到超时或有元素。
Lindex key index通过索引位置获取列表中的元素。
len键获取列表长度
Lsekey index value通过索引位置设置值。
Ltrim键start stop修剪列表,只保留指定间隔内的元素,删除间隔外的所有元素。
4. 集合(Set)
Redis集是字符串类型的无序集。成员是唯一的,这意味着集合中不能有重复的数据。在Redis中,集合是通过哈希表实现的,所以添加、删除和搜索的复杂度为O(1)。集合中的最大成员数是2 ^ 32-1。
常见命令:
Sadkeymember1 [member2]向集合中添加元素。
Scard key获取集合的成员数。
Sdiff key1 [key2]返回第一组和其他组之间的差。
Sinter key1 [key2]返回所有给定集合的交集。
Union key 1 [key 2]返回给定集合的并集。
Sismember key member确定成员元素是否是集合的成员。
Smembers键返回集合中的所有成员。
Spokey移除并返回集合中的一个随机元素。
Srmemberkey [count]返回集合中的一个或多个随机数。
Emkey member1 [member2]从集合中移除一个或多个成员。
5. 有序集合(sorted set)
Redis有序集和set一样,都是字符串元素的集合,不允许有重复成员。不同的是,每个元素都与一个双倍分数相关联。Redis根据分数从小到大对集合中的成员进行排序。
常见命令:
zakey score 1 member 1[score 2 member 2]向有序集添加一个或多个成员,或者更新现有成员的分数。
Zcard key获取有序集合中的成员数。
Zrange key start end [withscores]通过索引间隔返回有序集的成员。
ZrRange键Start Stop [with scores]返回整个索引区间内有序集的成员,得分从最高到最低。
zrangebyscore key min max[with scores][limit]根据分数返回有序集的指定区间内的成员。
zrangebyscore key min max[with scores][limit]按分数返回有序集的指定区间内的成员,分数从高到低排序。
Em关键成员[成员.]已删除
Zremrangebyrank键start stop删除给定排名范围内的所有成员。
Zremrangebyscore key min max删除给定分数范围内的所有成员。
Zscore key member返回有序集合中成员的分数。
二、Redis的高级数据结构1. HyperLogLog
Redis在2.8.9版本中增加了HyperLogLog结构。Redis HyperLogLog是一种用于进行基数统计的算法。HyperLogLog的优势在于,当输入元素的数量或体积非常非常大时,计算基数所需的空间总是固定且很小的。这只是一个估计,存在一定误差。
基数计算是指统计一批元素中不重复元素的个数,比如UV统计。集合是实现基数统计最常用的数据结构。但是,在数据量很大的情况下,集合会占用大量的存储空间。
常见命令:
添加关键元素[元素.]将指定元素添加到HyperLogLog。
Pfkey [key.]返回给定键的基数估计值。
merge dest key source key[source key.]将多个超级日志合并为一个。
2. GEO
Redis GEO主要用于存储和操作地理位置信息。这个函数是在Redis3.2版本3.2中添加的。
常见命令:
添加geokey纬度成员[经度纬度成员.]添加地理坐标
Geopos关键成员[成员.]返回指定成员的纬度和经度。
geo dist key member 1 member 2[m | km | ft | mi]计算两个位置之间的距离后,即为单位。
米公里英尺英里
Geokey经度纬度半径m | km | ft | mi[with coord][with dist][with hash][count count][ASC | desc][store key][store dist key]以给定的经纬度为中心,返回该键中包含的所有位置元素,这些元素与中心的距离不超过给定的最大距离。
Geousbymember key成员半径m | km | ft | mi[with coord][with dist][with hash][count count][ASC | desc][store key][store dist key]同上,只是中间位置的引用由经纬度改为成员。
Geohash密钥成员[成员.]获取一个或多个元素的geohash值。
3. BitMap
位图的原理在上一篇文章中已经描述过了。可以作为大量数据的存储,但存储的内容只能是0或1。可以在10亿用户在线状态下使用,1代表在线,0代表离线。
该值只能是0或1。
setbit键偏移值
getbit键偏移量
Bitcount key获取值为1的数字
三、Redis 高级特性1. Redis事务
Redis的事务概念不同于数据库。Redis序列化一个事务中的所有命令,然后按顺序执行它们。Redis不能在Redis事务执行期间插入和执行另一个客户机的请求。事务中任何命令的失败都不会影响其他命令的执行,也不会回滚。
2. 发布订阅
订阅是一种通信模式,发送方发送消息,订阅方接受消息。客户端可以订阅多个通道,然后向该通道发送新消息,订阅该通道的所有客户端都可以接收该消息。
常见命令:
订阅频道[频道.]订阅一个或多个频道。
订阅模式.]订阅一个或多个符合给定模式的频道。
发布通道消息将消息发送到指定的通道。
取消订阅[频道].]]退订给定频道。
订阅频道[频道.]取消订阅给定模式的所有频道。
3. 脚本
Redis脚本由Lua解释器执行,Redis 2.6版通过嵌入支持Lua环境。
基本语法如下:
EVAL文数字密钥[密钥.arg [arg.]
示例:
EVAL return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]} 2 key1 key2第一秒
4. Redis Stream
Redstream是5.0版本中的新数据结构。Redis流主要用于消息队列。Redis本身有发布/订阅功能,但是有一个缺点。消息不是持久的,如果网络中断或关闭,数据将会丢失。
Redis流提供了消息持久化和主备复制的功能。它有一个消息链表,将所有连接的消息串在一起。每封邮件都有唯一的ID和内容。
常见命令:
Xakey id字段值[字段值.]添加消息
xamystream * name sass urname occc(*表示redis生成的id)
Xdel密钥ID [ID.]删除消息
Xrange键start end [COUNT count]查看消息
Xrange mystream-(-代表最小值和最大值)
XGROUP[CREATE KEY GROUP NAME ID-OR-$][SETI KEY GROUP NAME ID-OR-$][Destroy KEY GROUP NAME][Del Consumer KEY GROUP NAME Consumer NAME]创建使用者组
从零开始消费:
xgroup创建mystream消费者组名称0-0
从尾部开始支出,只接受新消息。
xgroup create my stream consumer-group-name $
xread group group group consumer[count count][block millions][noack]streams key[key.] id [id.]阅读来自消费者团体的信息。
xread GROUP GROUP consumer-GROUP-name consumer-name COUNT 1 STREAMS my stream
第二组:消费者组名称
消费者:消费者姓名
计数:读取数量
毫秒:阻塞毫秒
关键字:队列名称
id:消息ID
四、Redis使用场景1. 业务数据缓存
1.通用数据缓存:字符串和列表
2.等待会话缓存、令牌和会话缓存。
2. 业务数据处理
1.一致性要求不严格的数据
2.业务操作的去重复:订单处理的业务数据排序的幂等验证。
3. 全局一致计数
1.全局流量控制
2.高峰期间的库存计算
3.全局ID生成
4. 高效统计计数
1.对1.id、ip等使用位图操作。
2.使用HyperLogLog进行UV、PV等不准确的统计。
5. 发布订阅与Stream
消息发布的订阅模式
6. 分布式锁
1.打开锁
设置密钥my_random_value NX PX 30000
2.为了释放锁,需要lua脚本来确保原子性。
如果redis.call(get ,KEYS[1])==ARGV[1]那么
返回redis.call(del ,KEYS[1])
其他
返回0
结束
五、Redis的Java客户端1. Jedis
基于BIO,线程是不安全的,所以需要配置连接池来管理连接。
2. Lettuce
目前主流的推荐驱动是基于Netty NIO和API线程安全。
3. Redission
基于Netty NIO,API线程安全。大量的分布式功能,如分布式基本数据类型和锁。
六、项目集成1. SpringMvc项目可以引入Spring data redis
Maven依赖性
属国
groupIdorg.springframework.data/groupId
artifactId spring-data-redis/artifactId
version2.1.2.RELEASE/version
/依赖关系
核心是redisTemplate(可以基于Jedis、莴苣和Redisson进行配置),封装了基本的Redis命令。
2. SpringBoot接入(默认使用的Lettuce)
属国
groupIdorg.springframework.boot/groupId
artifactId spring-boot-starter-data-redis/artifactId
/依赖关系
配置spring.redis
例如spring.redis.host=127.0.0.1
3. Spring Cache 集成Redis
1.启用Spring缓存
@EnableCaching
2.在方法上添加缓存注释。
@覆盖
@Cacheable(value=userCache )
公共用户getUser(整数id) {
返回user mapper . getuser(id);
}
3.配置redisCache
@配置
公共类CacheConfig {
@Bean
public RedisCacheManager cache manager(RedisConnectionFactory RedisConnectionFactory){
返回rediscachemanager . create(redisConnectionFactory);
}
}
番外:1.是1。Redis单线程还是多线程?
这个问题有漏洞。首先,Redis作为一个进程是多线程的。比如Redis通过多线程在后台删除对象,Redis模块实现的blocking命令等等。单线程是检测哪一个收到了请求的数据——数据处理——数据返回。而其他耗时的操作使用其他线程。
IO多路复用模型用于检测哪个客户端的请求已被接受。“复用”是指多个网络连接,“复用”是指复用同一个线程。
2.为什么在Redis6之前IO模块是单线程的?
因为Redis是基于内存的操作,CPU不是瓶颈。瓶颈在于机器内存或网络带宽的大小。
3.Redis 6之后的多线程是什么?
IO模型采用多线程NIO模型,内存处理线程为单线程。
以上是Redis的详细内容。更多关于Redis的信息,请关注我们的其他相关文章!