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命令防止锁问题,当超过设定的只之后,自动释放锁
set key value nx px 30000 
  • 释放锁
    释放锁的阶段并不是原子,包含查询和删除两个阶段,如果在查询时遇到了Redis中的锁超时自动释放的情况,被其他线程持有,那会会造成全局锁的混乱。
    基于以上情况课次阿勇lua脚本,此脚本在查询和释放层面是原子操作,避免因锁释放引起的全局锁问题。
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效率低,
  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值