Redis

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 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
    1. 批量操作在发送 EXEC 命令前被放入队列缓存。
    2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行
    3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中
  • 一个事务从开始到执行会经历以下三个阶段:开始事务 ->命令入队 ->执行事务
// 标记一个事务块的开始。
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

相关推荐

  1. <span style='color:red;'>Redis</span>

    Redis

    2024-03-24 14:20:03      62 阅读
  2. <span style='color:red;'>Redis</span>

    Redis

    2024-03-24 14:20:03      128 阅读
  3. <span style='color:red;'>Redis</span>

    Redis

    2024-03-24 14:20:03      42 阅读
  4. <span style='color:red;'>redis</span>

    redis

    2024-03-24 14:20:03      67 阅读
  5. <span style='color:red;'>Redis</span>

    Redis

    2024-03-24 14:20:03      51 阅读
  6. <span style='color:red;'>redis</span>

    redis

    2024-03-24 14:20:03      67 阅读
  7. <span style='color:red;'>Redis</span>

    Redis

    2024-03-24 14:20:03      60 阅读
  8. <span style='color:red;'>redis</span>

    redis

    2024-03-24 14:20:03      71 阅读
  9. Redis

    2024-03-24 14:20:03       58 阅读
  10. <span style='color:red;'>redis</span>

    redis

    2024-03-24 14:20:03      62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-24 14:20:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-24 14:20:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-24 14:20:03       87 阅读
  4. Python语言-面向对象

    2024-03-24 14:20:03       96 阅读

热门阅读

  1. BERT与GPT

    2024-03-24 14:20:03       44 阅读
  2. 浏览器强缓存和弱缓存的主要区别

    2024-03-24 14:20:03       46 阅读
  3. 如何结合NLP和图像描述技术

    2024-03-24 14:20:03       41 阅读
  4. Python实战:枚举类型enum及应用

    2024-03-24 14:20:03       44 阅读
  5. make | ubuntu源码编译指定版本make

    2024-03-24 14:20:03       40 阅读
  6. 通用型服务器和专用型服务器的区别

    2024-03-24 14:20:03       40 阅读
  7. 【React】React中将 Props 传递给组件

    2024-03-24 14:20:03       42 阅读
  8. 自定义Redis工具类(解决缓存穿透和击穿)

    2024-03-24 14:20:03       49 阅读
  9. qiankun实现基座、子应用样式隔离

    2024-03-24 14:20:03       44 阅读
  10. npm 常用命令详解

    2024-03-24 14:20:03       35 阅读
  11. 好玩的AI生产PPT工具分享

    2024-03-24 14:20:03       42 阅读
  12. Spark面试整理-Spark是什么?

    2024-03-24 14:20:03       36 阅读
  13. lin_20240321_calculating_rG4score.R

    2024-03-24 14:20:03       36 阅读
  14. 0324Caliper测试fabric1.4的TPS与Delay

    2024-03-24 14:20:03       47 阅读
  15. SCI论文发表很容易【8】:参考文献的格式

    2024-03-24 14:20:03       40 阅读