请选择 进入手机版 | 继续访问电脑版

[Redis] Redis入门教程详解

[复制链接]
查看142 | 回复21 | 2021-9-14 01:46:08 | 显示全部楼层 |阅读模式
目次

Redis

Redis是一个开源(BSD答应 )的内存数据布局 存储,用作数据库、缓存和消息代理。Redis提供数据布局 ,如strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams.。Redis具有内置复制、Lua脚本、LRU eviction、事件 和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster的自动 分区提供高可用性。

一、Redis基本数据布局

1. 字符串 (String)

字符串范例 是Redis中最为基础的数据存储范例 ,它在Redis中是二进制安全的,这意味着该范例 可以担当 任何格式的数据,如JPEG图像数据或json对象形貌 信息等。在Redis中字符串范例 的value最多可以容纳的数据长度是512M。

常用下令 :

  • set key value 设置值
  • get key 获取值
  • getset 将给定的值设置进去,并返回旧值
  • mget key1 key2... 获取一个或多个key的值
  • setnx key value 当key不存在时才设置值
  • incr key 将key存储的值+1
  • incrby key increment 将 key 所储存的值加上给定的增量值(increment)
  • decr key 将key存储的值-1
  • decrby key increment 将 key 所储存的值减去给定的增量值(increment)
  • strlen key 返回key所存储的字符串的长度

留意 :

1.字符串append下令 会利用 更多的内存

2.整数共享:假如 能利用 整数,就只管 利用 整数

3.整数精度题目 :redis能保证16位精度,17-18位的大整数就会丢失精度

2. 散列(hash)

Redis中Hash范例 可以当作 句又String key和String value的map容器。以是 该范例 非常得当 存储对象的信息。

常用下令 :

  • hset key field value
  • hget key field
  • hmset key field1 value1 [field2 value2 ] 同时set多个field值
  • hmget key field1 [field2]
  • hgetall key 获取key的全部 值
  • hincrby key field increment 给指定的key的field增长 给定的增量值(increment)
  • hkeys key 获取某个key的全部 field
  • hvals key 获取某个key的全部 value
  • hlen key 获取hash表中字段的数目
  • hexists key field 查看hash表中的字段是否存在
  • hdel key field1 [field2] 删除一个或多个hash表字段

3. 列表(list)

在Redis中,List范例 是按照插入次序 排序的字符串链表。和数据库布局 中的平凡 链表一样,可以在头部和尾部添加新的元素。在插入时假如 键不存在,Redis将为该键创建一个新的链表。与此相反,假如 链表中全部 的元素均被移除,那么该键也会被从数据库中删除。

常用下令 :

  • lpush key value1 [value2] 将一个值或多个值插入到列表头部
  • rpush key value1 [value2] 将一个值或多个值插入到列表尾部
  • lrange key start stop 获取列表指定范围的元素
  • lpop key 移出并获取列表中的第一个元素
  • rpop key 移出并获取列表中的末了 一个元素
  • blpop key1 [key2 ] timeout 壅闭 性的移出并获取列表的第一个元素,假如 没有元素就会壅闭 到超时或有元素为止
  • brpop key1 [key2 ] timeout 壅闭 性的移出并获取列表的末了 一个元素,假如 没有元素就会壅闭 到超时或有元素为止
  • lindex key index 通过索引位置获取列表中的元素
  • llen key 获取列表长度
  • lset key index value 通过索引位置设置值
  • ltrim key start stop 对一个列表举行 修剪,只保留指定区间的元素,区间外的都删除掉

4. 集合(Set)

Redis 的 Set 是 String 范例 的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,以是 添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 2^32 - 1

常用下令 :

  • sadd key member1 [member2] 向集合中添加元素
  • scard key 获取集合的成员数
  • sdiff key1 [key2] 返回第一个集合与其他集合之间的差异
  • sinter key1 [key2] 返回给定全部 集合的交集
  • sunion key1 [key2] 返回给定集合的并集
  • sismember key member 判定 member元素是否是集合中的成员
  • smembers key 返回集合中全部 成员
  • spop key 移除并返回集中中的一个随机元素
  • srandmember key [count] 返回集合中一个或多个随机数
  • srem key member1 [member2] 移除集合中一个或多个成员

5. 有序集合(sorted set)

Redis 有序集合和集合一样也是 string 范例 元素的集合,且不答应 重复的成员。不同的是每个元素都会关联一个 double 范例 的分数。redis 正是通过分数来为集合中的成员举行 从小到大的排序。

常用下令 :

  • zadd key score1 member1 [score2 member2] 向有序集合中添加一个或多个成员,或更新已有成员的分数
  • zcard key 获取有序集合中的成员数目
  • zrange key start end [withscores] 通过索引区间返回有序集合中的成员
  • zrevrange key start stop [WITHSCORES] 通过索引区间返回有序集合中的成员,分数从高到低
  • zrangebyscore key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
  • zrevrangebyscore key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员,分数由高到低排序
  • zrem key member [member ...] 移除
  • zremrangebyrank key start stop 移除给定排名区间的全部 成员
  • zremrangebyscore key min max 移除给定分数区间的全部 成员
  • zscore key member 返回有序集合中成员的分数

二、Redis的高级数据布局

1. HyperLogLog

Redis 在 2.8.9 版本添加了 HyperLogLog 布局 。Redis HyperLogLog是用来做基数统计的算法,HyperLogLog的长处 是,在输入元素的数目 或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。不过这个是估算,有肯定 的偏差 。

  1. 基数计算指的是统计一批元素中不重复元素的个数,比如UV的统计。实现基数统计最常见的是用Set这种数据结构。但是大数据量下Set会占用很大的存储空间。
复制代码

常用下令 :

  • pfadd key element [element ...] 添加指定元素到HyperLogLog 中
  • pfcount key [key ...] 返回给定key的基数估算值
  • pfmerge destkey sourcekey [sourcekey ...] 将多个hyperloglog 合为一个

2. GEO

Redis GEO紧张 用于存储地理位置信息,并对其举行 操作。该功能在Redis3.2版本增长

常用下令 :

  • geoadd key longitude latitude member [longitude latitude member ...] 添加地理位置坐标
  • geopos key member [member ...] 返回指定member的经纬度
  • geodist key member1 member2 [m|km|ft|mi] 计算两个位置的间隔 后面的是单位
  1. m【米】 km【千米】 ft【英尺】 mi【英里】
复制代码
  • georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] 以给定的经纬度为中心 ,返回键包含的元素中,与中心 间隔 不超过给定最大间隔 的全部 位置元素
  • georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] 同上,只不过中心 位置的传参由经纬度变成了member
  • geohash key member [member ...] 获取一个或多个元素的geohash值

3. BitMap

BitMap的原理上一篇已经讲过了,它可以用作大数据量的存储,不过存储的内容只能是0或1. 可以利用 在10亿用户的在线状态,1代表在线,0代表离线。

value值只能是0、1

  • setbit key offset value
  • getbit key offset
  • bitcount key 获取值为1的个数

三、Redis 高级特性

1. Redis事件

Redis的事件 与数据库的事件 概念不同,Redis会将一个事件 中的全部 下令 序列化,然后按次序 实行 。Redis不大概 在一个Redis事件 的实行 过程中插入实行 另一个客户端发出的哀求 ,事件 中恣意 下令 失败不影响其他下令 的实行 ,也不会回滚。

2. 发布订阅

发布订阅是一种通讯 模式,发送者发送消息,订阅者担当 消息。客户端可以订阅多个频道,然后有新消息发送给频道,订阅该频道的客户端就都能收到消息。

Redis入门教程详解

常用下令 :

  • subscribe channel [channel ...] 订阅一个或多个频道
  • psubscribe pattern [pattern ...] 订阅一个或多个符合给定模式的频道
  • publish channel message 将消息发送到指定通道
  • unsubscribe [channel [channel ...]] 退订给定的频道
  • punsubscribe channel [channel ...] 退订全部 给定模式的频道。

3. 脚本

Redis 脚本通过Lua表明 器来实行 脚本,Redis 2.6 版本通过内嵌支持Lua环境

基本语法如下:
EVAL script numkeys key [key ...] arg [arg ...]

例子:

  1. EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
复制代码

4. Redis Stream

Redis Stream是5.0版本新增的数据布局 。Redis Stream紧张 用于消息队列,Redis本身有一个发布/订阅功能,但是它有一个缺点,消息没有持久化,假如 网络制止 或宕机,数据就会丢失。

Redis Stream提供了消息的持久化和主备复制功能,它有一个消息链表,把全部 加入的消息都串起来,每个消息都有唯一的ID和内容。

常用下令 :

  • xadd key ID field value [field value ...] 添加消息
  1. xadd mystream * name sa surname occc (*代表id由redis生成)
复制代码
  • xdel key ID [ID ..] 删除消息
  • xrange key start end [COUNT count] 查看消息
  1. xrange mystream - + (- 代表最小值,+ 代表最大值)
复制代码
  • xgroup [CREATE key groupname id-or-$] [SETID key groupname id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername] 创建斲丧 者组

从头开始斲丧 :

  1. xgroup create mystream consumer-group-name 0-0
复制代码

从尾部开始斲丧 ,只担当 新消息

  1. xgroup create mystream consumer-group-name $
复制代码
  • xreadgroup group group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...] 从斲丧 者组读取消息
  1. XREADGROUP GROUP consumer-group-name consumer-name COUNT 1 STREAMS mystream
复制代码
  1. 第二个group :消费组名
  2. consumer: 消费者名
  3. count :读取数量
  4. milliseconds : 阻塞毫秒数
  5. key :队列名
  6. ID:消息id
复制代码

四、Redis利用 场景

1. 业务数据缓存

1.通用数据缓存:String、list

2.等会话缓存、token、session缓存

2. 业务数据处理

1.非严格 同等 性要求的数据

2.业务操作去重:订单处理的幂等校验业务数据排序

3. 全局同等 计数

1.全局流控

2.秒杀时库存计算

3.全局ID天生

4. 高效统计计数

1.id、ip等利用 bitmap操作

2.利用 HyperLogLog举行 UV、PV等非精确 性的统计

5. 发布订阅与Stream

用于消息发布订阅模式

6. 分布式锁

1.获取锁

  1. set key my_random_value NX PX 30000
复制代码

2.开释 锁,必要 用到lua脚本保证原子性

  1. if redis.call("get",KEYS[1])==ARGV[1] then
  2. return redis.call("del",KEYS[1])
  3. else
  4. return 0
  5. end
复制代码

五、Redis的Java客户端

1. Jedis

基于BIO、线程不安全,必要 设置 毗连 池管理毗连

2. Lettuce

现在 主流保举 的驱动,基于Netty NIO,API线程安全

3. Redission

基于Netty NIO,API线程安全。大量丰富的分布式功能,如分布式的基本数据范例 和锁。

六、项目集成

1. SpringMvc项目可以引入Spring data redis

maven依赖

  1. <dependency>
  2. <groupId>org.springframework.data</groupId>
  3. <artifactId>spring-data-redis</artifactId>
  4. <version>2.1.2.RELEASE</version>
  5. </dependency>
复制代码

核心是RedisTemplate(可以设置 基于Jedis、Lettuce、Redisson),封装了基本的redis下令 。

2. SpringBoot接入(默认利用 的Lettuce)

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
复制代码

设置 spring.redis

如:spring.redis.host=127.0.0.1

3. Spring Cache 集成Redis

1.启用Spring Cache

  1. @EnableCaching
复制代码

2.方法上添加缓存注解

  1. @Override
  2. @Cacheable(value = "userCache")
  3. public User getUser(Integer id) {
  4. return userMapper.getUser(id);
  5. }
复制代码

3.设置 redisCache

  1. @Configuration
  2. public class CacheConfig {
  3. @Bean
  4. public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
  5. return RedisCacheManager.create(redisConnectionFactory);
  6. }
  7. }
复制代码

番外:

1.Redis到底是单线程,还是多线程?

这个题目 有坑。起首 Redis作为一个历程 来讲是多个线程的。比如Redis通过多线程方式在后台删除对象、以及通过 Redis模块实现的壅闭 下令 等.单线程的地方在于探测哪个吸取 完了哀求 数据->数据处理->返回数据。而其他耗时操作是用了其他线程。

探测哪个客户端的哀求 担当 完了,利用 的是IO多路复用模子 ,“多路”是指多个网络毗连 ,“复用”是复用同一个线程。

Redis入门教程详解

2.为什么IO模块在Redis6之前是单线程?

由于 Redis是基于内存的操作,CPU不是瓶颈,瓶颈在于机器内存的大小或网络带宽。
3. Redis6之后的多线程是什么?

IO模子 利用 了多线程的NIO模子 ,内存处理线程也还是单线程。

Redis入门教程详解

以上就是Redis详解的详细 内容,更多关于Redis的资料请关注脚本之家别的 干系 文章!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 李中文1 | 2021-9-14 03:29:06 | 显示全部楼层
admin楼主的帖子越来越有深度了!
回复

使用道具 举报

avatar 素色流年783 | 2021-9-14 06:46:55 | 显示全部楼层
你觉得该怎么做呢?
回复

使用道具 举报

avatar 卡庙寺 | 2021-9-18 08:14:51 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 大黄瓜xxxl | 2021-9-26 06:00:15 | 显示全部楼层
帖子很有深度!
回复

使用道具 举报

avatar 聪明牛得 | 2021-9-26 18:40:45 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,影视频道的网站所有电影和连续剧都可以免费看的。访问地址:http://tv.mxswl.com
回复

使用道具 举报

avatar 折失的誓言群 | 2021-9-27 06:08:35 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 是鹅好甜 | 2021-9-28 09:41:30 | 显示全部楼层
帖子好乱!
回复

使用道具 举报

avatar 天然悠然牌 | 2021-10-4 10:02:08 | 显示全部楼层
admin楼主练了葵花宝典吧?
回复

使用道具 举报

avatar 叶505 | 2021-10-11 07:50:10 | 显示全部楼层
信admin楼主,考试不挂科!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则