redis官网:https://redis.io/
redis中文网:https://www.redis.net.cn/
Redis(Remote Dictionary Server ),即远程字典服务。
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。
- 关系型数据库:列+行,同一个表下数据的结构是一样的。
非关系型数据库:数据存储没有固定的格式,并且可以进行横向扩展。 - 大数据时代的主要问题:
海量、多样、实时
大数据时代对程序的要求:高并发、高可扩、高性能
- Redis是单线程的,是基于内存操作的。
所以Redis的性能瓶颈是机器内存和网络带宽。
对于内存系统来说,读写都是在一个CPU上,没有上下文切换效率最高
(多线程CPU上下文切换会耗时)所以单线程就是最佳的方案
官方数据,读速度110000
次/s,写速81000
次/s。
数据库的不同使用场景
- 商品信息:关系型数据库:Mysql
- 文字居多:文档型数据库:MongoDB
- 图片:
分布式文件系统:FastDFS
淘宝:TFS
Google: GFS
Hadoop: HDFS
阿里云: oss - 用于搜索:搜索引擎:solr,elasticsearch
- 热门的波段信息:内存数据库:Redis,Memcache
- 外部接口:第三方应用
redis默认有16个数据库:db0~db15(默认使用db0)
不同数据库之间 数据是不能互通的
操作命令
更多命令教程:redis中文网:https://www.redis.net.cn/tutorial/3501.html
set key value
get key
// 测试100个并发连接100000次请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
// 查看数据库数量
config get databases
// 切换数据库
select 0
// 查看数据库大小
dbsize
// 查看所有的key
keys *
// 清空当前数据库中的键值对
flushdb
// 清空所有数据库的键值对
flushall
// 判断键是否存在
exists key
// 删除键值对
del key
// 将键值对移动到指定数据库1
move key 1
// 设置键值对的过期时间(秒钟倒计时)
expire key second
// 查看key的过期剩余时间,-2 表示过期,-1表示未设置过期时间
ttl key
// 查看value的数据类型
type key
// 修改 key 的名称
rename key newkey
// 仅当 newkey 不存在时,将 key 改名为 newkey
renamenx key newkey
数据类型
String 字符串
Redis 字符串数据类型的相关命令用于管理 redis 字符串值
还可以做计数器
List 列表
Redis列表是简单的字符串列表
,按照插入顺序排序
。
你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含(2的32次方 - 1)个元素 (4294967295, 每个列表超过40亿个元素)。
Redis中List是可以双端操作
的,所以命令分为了L开头和R开头两类
list实际上是一个链表
,在两边插入或者改动值,效率最高!修改中间元素,效率相对较低
应用:消息排队!消息队列(Lpush Rpop),栈(Lpush Lpop)
Set 集合
Redis 的 Set 是 String 类型的无序集合
。集合成员是唯一
的。
集合对象的编码可以是 intset 或者 hashtable。
Redis 中集合是通过哈希表实现
的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为(2的32次方 - 1)(4294967295, 每个集合可存储40多亿个成员)。
Hash 哈希
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表
,hash 特别适合用于存储对象
。
Redis 中每个 hash 可以存储(2的32次方 - 1)键值对(40多亿)。
Set就是一种简化的Hash,只变动key,而value使用默认值填充。
可以将一个Hash表作为一个对象进行存储,表中存放对象的信息
Zset 有序集合
Redis 有序集合
和集合一样也是string类型元素的集合
,且不允许重复
的成员。
不同的是每个元素都会关联一个double类型的分数
。redis正是通过分数
来为集合中的成员进行从小到大的排序
。
有序集合的成员是唯一
的,但分数(score)却可以重复
。
集合是通过哈希表实现
的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为(2的32次方 - 1)(4294967295, 每个集合可存储40多亿个成员)。
score相同:则会按照 member 的字典顺序进行排列
应用案例:重要消息、带权重进行判断、排行榜实现
Geospatial 地理位置
城市经纬度查询:http://www.jsons.cn/lngcode/
使用经纬度定位地理坐标
并用一个有序集合
zset保存
有效的经度
从-180度到180度。
有效的纬度
从-85.05112878度到85.05112878度。
单位:m米、km千米、mi英里、ft英尺。
// 添加
geoadd china:city 116.4 39.9 beijing
// 批量添加
geoadd china:city 116.4 39.9 beijing 121.4 31.2 shanghai
// 获取地理位置
geopos china:city beijing
// 获取两地直线距离
geodist china:city beijing xianggang
// 范围查找 (经度 纬度)为圆心 半径 km 内所有的城市
// withcoord 带上经纬度
// withdist 城市距离该点的直线距离
// count 查找个数
georadius china:city 110 30 1000 km withcoord withdist count 2
// 根据给定的元素确定中心点,再进行查找
georadiusbymember china:city shanghai 1000 km
// 将二维的经纬度转换为一维的字符串,经过hash之后的结果,两个字符串越像,代表越接近
geohash china:city beijing
Hyperloglog 基数统计
基数就是数据集中的不重复元素
。 基数估计
就是在误差可接受的范围内,快速计算基数。
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,其底层使用string数据类型
HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大
时,计算基数所需的空间总是固定的、并且是很小的
。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。
但是,因为 HyperLogLog 只会根据输入元素来计算
基数,而不会储存输入元素
本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
// 添加元素
pfadd key a b c
// 估算基数
pfcount key
// 将多个 HyperLogLog 合并为一个 HyperLogLog
pfmerge newkey key1 key2
BitMaps 位图
bitmaps是一串连续的二进制串,使用位存储,信息状态只有 0 和 1
// 设置key的第0位为 1(不设置默认是0)
setbit key 0 1
// 获取第 0位的值
getbit key 0
// 统计key中值为1的个数
bitcount key
事务
- Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
- 批量操作在发送 EXEC 命令前被放入队列缓存。
- 收到 EXEC 命令后进入事务执行,
事务中任意命令执行失败,其余的命令依然被执行
。 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中
。
- 一个事务从开始到执行会经历以下三个阶段:
开始事务
->命令入队
->执行事务
// 标记一个事务块的开始。
MULTI
// 取消事务,放弃执行事务块内的所有命令。
DISCARD
// 执行所有事务块内的命令。
EXEC
// 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
WATCH key [key ...]
// 取消 WATCH 命令对所有 key 的监视。
UNWATCH
单个 Redis 命令的执行是原子性的
,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的
。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
编译时异常
命令入队时就发生了错误,执行事务时所有的命令都不执行
运行时异常
事务执行时才发生了错误,错误的命令不影响队列中其他正常命令的执行
乐观锁
使用watch key监控指定数据,相当于乐观锁加锁。
// 每次监控数据前先取消监控(unwatch)再重新监控,确保监控的是最新的值
// 上锁(类似于获取字段的 version)
watch key
// 开启事务
multi
// 事务执行之前,监视值没有被中途修改,事务正常执行,如果被修改了,会导致事务执行失败
exec
每次提交执行exec后都会自动释放锁
Jedis
Jedis是Redis官方推荐的Java连接开发工具
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
Redis.conf
2024/03/23