Redis入门指南,Redis入门

Redis入门指南,Redis入门,Redis入门教程详解

本文详细介绍了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的信息,请关注我们的其他相关文章!

Redis入门指南,Redis入门