Redis 是 Remote Dictionary Server 的缩写,是一个开源的、基于内存的键值存储数据库。它不仅支持简单的键值对,还支持丰富的数据结构,如字符串、哈希、列表、集合、位图、HyperLogLogs等。同时,Redis 也支持持久化,能够将内存中的数据异步保存到磁盘上,是内存数据库中最具代表性的产品之一。
与传统数据库相比,Redis 的主要优势在于速度极快,它将数据存储在内存中,而不是硬盘,这使得数据读写操作的速度比传统数据库快了数百倍,适合需要快速响应的场景。
1.Redis的简介
Redis是一个基于内存的key-value结构数据库
- 基于内存存储,读写性能高
- 适合存储热点数据(热点商品,咨讯,新闻)
NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,
泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。
linux安装redis
yum install -y gcc tcl
安装依赖tar -zxvf redis.tar.gz
解压make && make install
编译安装- 安装目录
/usr/local/bin
在目录中启动redis-server
redis配置文件
1 | # 是否在后台执行,yes:后台运行;no:不是后台运行(老版本默认) |
2.Redis的常用的数据类型
- 字符串string 普通字符串
- 哈希hash 散列,类似于Java的HashMap结构
- 列表list 按照插入顺序排序,可以有重复元素
- 集合set 无序集合,没有重复元素,类似Java的HashMap
- 有序集合sorted set / zset 每个元素关联一个分数,根据分数升序排序,没有重复元素
3.Redis常用的操作
1.Redis通用操作
SELECT index
SELECT 1 切换到一号redis数据库
KEYS pattern
KEYS * 匹配所有
KEYS *name 匹配以name结尾的
DEL key
返回删除个数
DEL name 删除name
DEL k1 k2 k3 k4 k5 删除多个
EXISTS key
存在1 不存在为0
EXISTS num 是否存在num
EXPIRE key second
EXPIRE test 10 设置test存在20秒
TTL key
-2为不存在 -1为永久存储 其他的为剩余时间
TTL test 查看test的剩余时间
1.string操作
SET key value 设置指定key的值
SET name rc
GET key 获取指定key的值
GET name
SETEX key seconds value 设置指定key的value,并将key的过期时间设置为seconds秒
SETEX name 20 rc
SETNX key value 只有key不存在时才设置
SETNX key age
INCR key 自增1
INCR age
INCRBY key num 让key增加num,num可以为负数
INCRBY age -1
INCRBYFLOAT key num 让key增加num,num可以为负数
INCRBYFLOAT height 0.1
2.哈希操作
HSET key field value 设置指定字段的值
HGET key field 获取指定字段的值
HDEL key field 删除指定字段
HKEYS key 获取哈希表的所有的字段
HVALS key 获取哈希表的所有的值
3.列表操作命令
LPUSH key value1 [value2]
将一个或者多个值插入到列表头部
LPUSH mylist 1 2 3
RPUSH key value1 [value2]
将一个或者多个值插入到列表尾部
RPUSH mylist 4 5 6
LRANGE key start stop
获取列表指定范围内的元素
LRANGE mylist 1 2
RPOP key count
移除并获取列表最后count个元素
RPOP mylist 1
LPOP key count
移除并获取列表前count个元素
LPOP mylist 1
LLEN key
获取列表长度
LLEN mulist
BLPOP key timeout
如果列表为空则等待timeout,否则获取列表头元素
BLPOP mylist 20
BRPOP key timeout
如果列表为空则等待timeout,否则获取列表尾元素
BRPOP mylist 20
4.集合操作命令
SADD key member1 [member2] 添加成员
SADD myset 1 2 3 4
SMEMBERS key 返回所有成员
SMEMBERS myset
SCARD key 获取集合的成员数
SCARD myset
SINTER key1 [key2] 返回集合的交集
SDIFF key1 [key2] 返回集合的差集
SUNION key1 [key1] 返回集合的并集
SREM key member1 [member2] 删除集合中一个或多个成员
SISMEMBER key value 判断集合是否有value
SISMEMBER myset 1
5.有序集合
SortedSet
可排序的set,元素不能重复,查询速度快
ZADD key score1 member1 [score2 member2] 添加成员
ZADD ss 85 Alice 92 Bob 78 Cindy 88 Dave 95 Eve
ZRANGE key min max 按照排名排序
ZRANGE m 0 2
ZREVRANGE key min max 查询倒数几名
ZREVRANGE m 0 2
ZRANK ket member 获取sorted set中的指定元素的排名
ZRANK ss Alice
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment
ZINCRBY ss 2 Alice
SREM key member1 [member2 …] 删除集合中一个或多个成员
ZSCORE key member 获取指定元素的score值
ZCOUNT key min max 统计大于min小于max的人数
ZDIFF,ZINTER,ZUNION 求差集,交集,并集
ZRANGEBYSCORE key min max 获取位于min-max的score的属性值
ZRANGEBYSCORE m 0 80
4.Jedis
1.Jedis基本使用
引入依赖
1 | <dependencies> |
测试
1 | public class JedisTest { |
2.Jedis连接池
1 | public class RedisClient { |
5.SpringDataRedis
1.基本模版
1.导入坐标
1 | <dependency> |
2.配置redis数据源
1 | spring: |
3.新建配置类
1 |
|
4.获取操作对象
1 | ValueOperations valueOperations = redisTemplate.opsForValue(); |
2.操作string
1 |
|
3.操作hash
1 | HashOperations hashOperations = redisTemplate.opsForHash(); |
4.操作list
1 |
|
5.操作集合
1 |
|
6.操作有序集合
1 |
|
7.通用操作
1 |
|
8.StringRedisTemplate
使用stringRedisTemplate默认为string序列器,因此需要手动序列化
1 |
|
6.Redis脚本
EVAL命令
Redis中使用EVAL
命令来直接执行指定的Lua脚本。
1 | EVAL luascript numkeys key [key ...] arg [arg ...] |
EVAL
命令的关键字。luascript
Lua 脚本。numkeys
指定的Lua脚本需要处理键的数量,其实就是key
数组的长度。key
传递给Lua脚本零到多个键,空格隔开,在Lua 脚本中通过KEYS[INDEX]
来获取对应的值,其中1 <= INDEX <= numkeys
。arg
是传递给脚本的零到多个附加参数,空格隔开,在Lua脚本中通过ARGV[INDEX]
来获取对应的值,其中1 <= INDEX <= numkeys
。
如果我们要执行redis.call(‘set’,’name’,’lucy’)这个脚本
EVAL "return redis.call('set','name','lucy')" 0
样例
EVAL "return redis.call('set',KEYS[1],ARGV[1])" 1 RC RICHU
JAVA执行redis脚本
1 | private static final DefaultRedisScript<Long> UNLOCK_SCRIPT; |
1 | stringRedisTemplate.execute(UNLOCK_SCRIPT, |
Redisson
引入依赖
1 | <dependency> |
配置类RedissonConfig.java
1 |
|
使用
1 |
|
解决主从不一致问题
1 |
|
设置锁
1 | RLock lock1 = redissonClient1.getLock("order"); |
7 .Redis Pub/Sub
Redis提供了一组简单而强大的Pub/Sub命令,用于管理发布者和订阅者之间的消息传递。
1. 订阅相关命令
SUBSCRIBE:订阅一个或多个频道,接收发布到这些频道的消息。
1
2SUBSCRIBE channel [channel ...]
1PSUBSCRIBE:按模式订阅一个或多个频道,支持通配符。
1
2PSUBSCRIBE pattern [pattern ...]
1UNSUBSCRIBE:取消订阅一个或多个频道,或取消所有频道的订阅。
1
2UNSUBSCRIBE [channel [channel ...]]
1PUNSUBSCRIBE:取消按模式订阅一个或多个频道,或取消所有模式的订阅。
1
2PUNSUBSCRIBE [pattern [pattern ...]]
1
2. 发布相关命令
PUBLISH:向指定频道发布一条消息,所有订阅了该频道的订阅者都会接收到这条消息。
1
PUBLISH channel message
3. Redis Pub/Sub的特点
- 实时性高:消息一旦发布,订阅者几乎可以立即接收到,适用于需要即时响应的应用。
- 简单易用:Redis提供了简洁的命令集,易于集成和使用。
- 高效性能:由于Redis基于内存,Pub/Sub消息传递的延迟极低,吞吐量高。
- 去中心化:发布者和订阅者不需要知道彼此的存在,通过频道进行消息传递,降低了系统耦合度。
4.缺点
- 不支持数据持久化
- 无法避免数据丢失
8.Stream
XADD
使用 XADD 向队列添加消息,如果指定的队列不存在,则创建一个队列,XADD 语法格式:
1 | XADD key ID field value [field value ...] |
- key :队列名称,如果不存在就创建
- ID :消息 id,我们使用 * 表示由 redis 生成,可以自定义,但是要自己保证递增性。
- field value : 记录。
XRANGE
使用 XRANGE 获取消息列表,会自动过滤已经删除的消息 ,语法格式:
1 | XRANGE key start end [COUNT count] |
- key :队列名
- start :开始值, - 表示最小值
- end :结束值, + 表示最大值
- count :数量
XREVRANGE
使用 XREVRANGE 获取消息列表,会自动过滤已经删除的消息 ,语法格式:
1 | XREVRANGE key end start [COUNT count] |
- key :队列名
- end :结束值, + 表示最大值
- start :开始值, - 表示最小值
- count :数量
XREAD
使用 XREAD 以阻塞或非阻塞方式获取消息列表 ,语法格式:
1 | XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...] |
- count :数量
- milliseconds :可选,阻塞毫秒数,没有设置就是非阻塞模式
- key :队列名
- id :消息 ID
XGROUP CREATE
使用 XGROUP CREATE 创建消费者组,语法格式:
1 | XGROUP [CREATE key groupname id-or-$] [SETID key groupname id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername] |
- key :队列名称,如果不存在就创建
- groupname :组名。
- $ : 表示从尾部开始消费,只接受新消息,当前 Stream 消息会全部忽略。
XREADGROUP GROUP
使用 XREADGROUP GROUP 读取消费组中的消息,语法格式:
1 | XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...] |
- group :消费组名
- consumer :消费者名。
- count : 读取数量。
- milliseconds : 阻塞毫秒数。
- key : 队列名。
- ID : 消息 ID。
9.Redis GEO
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。
Redis GEO 操作方法有:
- GEOADD:添加地理位置的坐标。
- GEOPOS:获取地理位置的坐标。
- GEODIST:计算两个位置之间的距离。
- GEORADIUS:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
- GEORADIUSBYMEMBER:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
- GEOHASH:返回一个或多个位置对象的 geohash 值。
GEOADD
GEOADD用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
GEOADD语法格式如下:
1 | GEOADD key longitude latitude member [longitude latitude member ...] |
GEOADD g1 116.407396 39.904252 bj
GEOADD g1 121.473701 31.230416 sh
GEOADD g1 113.264356 23.129378 gz
GEOPOS
GEOPOS用于从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
GEOPOS语法格式如下:
1 | GEOPOS key member [member ...] |
GEOPOS g1 bj
GEODIST
GEODIST用于返回两个给定位置之间的距离。
GEODIST语法格式如下:
1 | GEODIST key member1 member2 [m|km|ft|mi] |
member1 member2 为两个地理位置。
最后一个距离单位参数说明:
- m :米,默认单位。
- km :千米。
- mi :英里。
- ft :英尺。
GEODIST g1 bj sh
GEODIST g1 bj sh km
GEORADIUS、GEORADIUSBYMEMBER
GEORADIUS以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
GEORADIUSBYMEMBER和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 georadiusbymember 的中心点是由给定的位置元素决定的, 而不是使用经度和纬度来决定中心点。
GEORADIUS与 GEORADIUSBYMEMBER语法格式如下:
1 | GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] |
参数说明:
- m :米,默认单位。
- km :千米。
- mi :英里。
- ft :英尺。
- WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。
- WITHCOORD: 将位置元素的经度和纬度也一并返回。
- WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
- COUNT 限定返回的记录数。
- ASC: 查找结果根据距离从近到远排序。
- DESC: 查找结果根据从远到近排序。
GEOHASH
Redis GEO 使用 GEOHASH来保存地理位置的坐标。
GEOHASH用于获取一个或多个位置元素的 GEOHASH值。
GEOHASH语法格式如下:
1 | GEOHASH key member [member ...] |
GEOHASH g1 bj