redis

文章目录

redis概要

Redis 由C语言编写,是基于内存级别的数据库,通常作为缓存使用。

特点:

  1. 读写效率高,读操作10万次/s; 写操作8万次/s
  2. 支持事务
  3. 单线程处理命令,杜绝了并发、上下文切换等问题,效率高
  4. 可用做分布式锁

为什么Redis快?

  1. 基于内存
  2. 网络IO方面,6版本之后采用NIO模式;内存命令处理采用单线程,杜绝了并发竞争以及上下文切换问题

数据类型

字符串

  1. 字符串本身可以表示三种类型:string、int、byte
  2. 基于二进制存储 可存储json、JPEG图片
  3. 单个字符串最大长度为 512M
操作

常规:get、set、del、exists、append

按整形:incr、decr、incrby、decrby
注:

  • append 会使用更多的内存
  • 整书共享,再添加时,如果内存中已经存在相同的值,不在创建而是复用。注意引起的LRU淘汰策略问题
  • 精度问题 最大保证16位,过长的整数存储可能丢失精度。可在代码层面存储chart型进行规避

hash

就是一个 hash散列表,和Java层面的map数据结构类似,数组+链表结构;

少量的字段竞占用很少的空间?

list

链表结构,类似数据结构中的双端链表,支持两端进出已经中间的范围查询

set

无序的集合,不允许只重复,提供添加、查找、删除操作。这些操作都是O(1)级别?,另外支持 交集、差集、并集操作,

zset

有序集合,使用上相比set在存储时 需要value前边关联一个数值,用于排序

位图

?进行与或运算,用于位运算的比较

地理位置

以某个点为圆心,计算其他点到此圆心的距离

使用场景

1. 缓存

  • 长时间不变的数据缓存
  • 热点数据缓存
  • 会话缓存

2. 业务处理

基于set数据类型的排行榜、排名

3. 全局的一致计数

  • 浏览量

4. 发布订阅

5. 分布式锁

  • 获得锁
    对于全局的数据,借助redis的单线程处理排除竞争关系,另外借助setnx 判断是否存在已经已经上了锁,另外借助px命令防止锁问题,当超过设定的只之后,自动释放锁
sql 复制代码
set key value nx px 30000 
  • 释放锁
    释放锁的阶段并不是原子,包含查询和删除两个阶段,如果在查询时遇到了Redis中的锁超时自动释放的情况,被其他线程持有,那会会造成全局锁的混乱。
    基于以上情况课次阿勇lua脚本,此脚本在查询和释放层面是原子操作,避免因锁释放引起的全局锁问题。
shell 复制代码
if redis.call("get",KEYS[1])==ARG[1] then
  return redis.call("del",KEYS[1])
else 
return 0
end

原子性 超时 互斥

持久化机制

有两种RDB和AOF

RDB(默认)

周期性的将redis中的缓存喜爱那个dump.rdb文件中存储一份,恢复时,直接加载此文件

优点:

  1. 启动效率高
  2. 使用子进程IO同步,不影响主进程的执行
  3. 只有一个rdb文件,方便持久化,容灾性好
    缺点
  4. redis崩溃时,有可能会造成一段短时间的数据丢失

AOF

可配置的方式,每处理一个命令记录一次,或者每一批命令记录一次,可'appendfsync'配置,记录到一个类似binlog的文件中;

记录的是命令而不是数据。

优点:

保证数据的安全性

缺点:

  1. 文件大,启动慢
  2. Redis效率低,
相关推荐
2401_891409263 小时前
量化数据13:港股分钟K线、Level2逐笔Tick、十档盘口和港股通历史数据的批量提取
数据库
w-w0w-w9 小时前
SQL注入
网络·数据库·sql
tianyuanwo9 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
一条泥憨鱼9 小时前
【计算机网络】短连接、长连接与连接池:从 TCP 握手到池化复用的完整链路
网络·数据库·网络协议·tcp/ip·计算机网络
我不会起名字3229 小时前
Redis 从 0 到 1(十七):订单 30 分钟不支付自动关闭——ZSet 延迟队列 Go 实现
redis·go·延迟队列·zset·订单
IvorySQL9 小时前
深入 PostgreSQL WAL:从崩溃恢复到逻辑复制
数据库·postgresql
利威尔xu10 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
幽灵诶11 小时前
Mysql(基于测试的学习)
数据库·mysql
砚底藏山河11 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
利威尔xu11 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang