redis个人整理笔记

reids常见数据结构

  • 基本类型

    • String: 普通key-value

    • Hash: 类似hashMap

    • List: 双向链表

    • Set: 不可重复

    • SortedSet: 不可重复,有序,hash+跳表

  • 特殊类型

    • GEO:地理位置

    • BitMap:

    • HyperLog

redis通用命令

  • keys:所有key

  • del:删除

  • exists:判断是否存在

  • expire: 设置有效期

  • ttl:查看key剩余失效时间

数据类型

string类型
  • 特性:

    • string:普通字符串

    • int:可以自增自减

    • float:可以自增自减

    • 最大空间不能超过512m

  • 常见命令:

    • set:无则添加,有则覆盖

    • get:获取key的值

    • mset:批量添加键值对

    • mget:批量获取key的值

    • incr:让一个整形自增

    • incrBy:让整形自增指定步长

    • incrByFloat:让一个浮点类型的数字自增并指定步长

    • setNx:无则新增,有则不执行

    • setEx:添加一个string类型的键值对,并且指定有效期

hash类型
  • 特性:

    • hash类型,也叫散列,其value是一个无序字典,类似java中hashMap

  • 常见命令:

    • hset:添加或则修改hash类型的key的值

    • hget:获取value值

    • hmset:批量hash新增

    • hmget:批量hash查询

    • hgetAll:获取一个hash类型中的所有key-vlues键值对

    • hkeys:获取一个hash类型的key中所有的key

    • hvals:获取一个hash类型的key中所有的值

    • hincrby:让一个hash类型的key的字段值自增并指定步长

    • hsetnx:添加一个hash类型的值,有则不添加,前提这个key不存在,否则不知想

list类型
  • 特性:

    • 类似java中的linkedList,可以看作一个双向链表,既可以支持正向检索,也可反向

    • 有序

    • 元素可以重复

    • 插入和删除块

    • 查询速度一般

    • 常用来存储一个有序数据例如,点赞,评论列表

  • 常见命令

    • lpush:向列表左侧插入一个或多个元素

    • lpop:移除并返回左侧第一个元素,没有则返回nil

    • rpush:列表右侧插入一个或者多个元素

    • lrange 返回一个角标范围内的所有元素

    • blpop和brpop,没有元素时等待指点时间,而不是之家返回nil

  • 场景

    • 1.模拟栈

    • 入口和出口在同一边,先进后出

    • 2.模拟队列

    • 入口和出口不在同一边,先进先出

    • 3.阻塞队列

    • 入口出口不在同一边,出队时候才有blpop或者brpop

set类型
  • 特性:

    • 可以看作value为null的hashMap

    • 无序

    • 元素不可重复

    • 查找快

    • 支持交并差

  • 常见命令

    • sadd:添加一个或者多个元素

    • srem:移除指定元素

    • scard:返回个数

    • sismember,判断元素是否存在

    • smembers:获取所有元素

    • sinter k1 k2 :求交集

    • sdiff k1 k2 :求差集

    • sunion k1 k2 : 求并集

sortedSet类型
  • 特性

    • 可排序的set集合,每个元素有个score属性,可以基于score对元素进行排序,底层是跳表加hash表

    • 可排序

    • 元素不重复

    • 查询速度块

    • 常用来实现排行榜

  • 常见命令

    • zadd: 添加一个或多个如果已存在则更新score值

    • zrem :删除指定一个元素

    • zscore:获取指定key的分值

    • zrank:获取指定元素的排名

    • zcard,获取元素个数

    • zcount key min mak:统计分值在指定范围内的所有元素的个数

    • zincrby:指定步长自增

    • zrange:获取指定排名范围内元素

    • zrangebyscore:获取指定分值范围内的元素

    • zdiff,zinter,zunion:求差集,交集并集

    • 所有的排名默认都是升序

redis应用场景

  • 基于list实现点赞列表

  • 基于sortedset实现排行榜

  • 基于set实现共同关注,共同好友

  • 基于bitmap实现签到数据统计

  • 基于hyperLogLog实现Uv统计

  • geohash实现地理位置

  • Lua脚本+setnx实现分布式锁

  • 计数器

  • 热点数据查询缓存

  • 共享session

  • 时效性数据,短信验证码

  • 全局唯一id

  • 分布式锁

缓存作用及成本

  • 作用:

    • 降低后端负载

    • 提高读写效率,降低响应时间

  • 成本:

    • 数据一致性成本

    • 代码维护性成本

    • 运维成本

缓存更新策略

  • 低一致性:

超时时间机制,内存默认淘汰机制

  • 高一致性:

主动更新,超时剔除作为兜底,修改直接删除缓存,提高一致性,先删除数据库数据,再删除缓存数据,查询时候在添加缓存

缓存穿透,击穿,雪崩

  • 穿透:

出现原因:

请求缓存数据库中不存在的值

解决方案:

缓存短时间空值/布隆过滤器/增加id复杂度/做好基础格式校验/加强用户权限校验/做好限流

  • 击穿:

出现原因:

热点数据失效,大并发打入数据库

解决方案

互斥锁:

互斥更新只允许一个线程去查库重建缓存,其他等待递归,没有额外的内存消耗,保证一致性,实现简单,线程需要等待性能影响,可能会死锁

逻辑过期:

线程无序等待,但是不保证一致性,有额外的内存消耗,实现复杂

  • 雪崩:

出现原因:

大批量key同时失效,并发同时打入数据库/reids宕机

解决方案:

随机秒数稀释缓存失效时间

redis高可用

分布式锁

  • 实现思路

    • 利用setnx获取锁,并设置过期时间,保存线程标识

    • 释放锁先判断线程标识是否与自己一致,一致则删除(原因:不加标识如果线程阻塞,锁超时释放,则其他线程获取到该锁,如果没有唯一标识则可能会删别人的锁,造成并发问题)

  • 特性

    • 利用setNx满足互斥

    • 利用超时时间避免死锁

    • 利用redis集群保证高可用高并发

  • 出现问题

    • 不可重入:同一个线程无法多次获取同一把锁

    • 不可重试:获取锁只尝试一次没有重试机制的话会造成500人1秒并发进行抢购100商品,可能会出现商品还有剩余

    • 超时释放:如果线程执行较长,导致锁释放,存在隐患

    • 主从一致性:如果redis主从存在延迟,当主节点宕机,如果存在数据部分未同步,主从出现了切换,存在隐患.

redission分布式锁框架(更新中)

redis整理:常用命令,雪崩击穿穿透原因及方案,分布式锁实现思路,分布式锁redission(更新中)的更多相关文章

  1. Jedis对Redis的常用命令操作

    本篇主要总结一些Jedis对Redis的常用命令操作: 1.对key操作命令 2.对String操作命令 3.对List操作命令 4.对Set操作命令 5.对Hash操作命令 6.排序操作指令 一.项 ...

  2. Linux下安装redis以及常用命令

    https://blog.csdn.net/zgf19930504/article/details/51850594 安装: 1.获取redis资源 wget http://download.redi ...

  3. Redis的常用命令与Java整合及高级应用篇

    一,redis是什么? ​ 首先数据库分为关系型数据库和非关系型数据库,关系型数据库是采用关系模型来组织数据的数据库,简单来说就是二维表格模型,同时保证事务的一致性. ​ 相反非关系型数据库采用key ...

  4. 05_NoSQL数据库之Redis数据库:Redis的常用命令,键值相关命令和服务器相关命令

     Redis常用命令 Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以再Linux终端使用. 键值相关命令: Keys:返回满足给定pattern的所有key 用表达式*表 ...

  5. 【redis】常用命令

    三.常用命令    1)连接操作命令    quit:关闭连接(connection)    auth:简单密码认证    help cmd: 查看cmd帮助,例如:help quit         ...

  6. Redis(2):常用命令详解

    redis命令不区分大小写 通用命令:1. 获得符合规则的键名列表: keys pattern   其中pattern符合glob风格  ? (一个字符) * (任意个字符) [] (匹配其中的任意一 ...

  7. centos7 yum安装redis及常用命令

    redis是什么 Redis是一种基于内存的数据结构存储,可持久化的日志型.Key-Value数据库.使用关系型数据库的站点达到一定并发量的时候,往往在磁盘IO上会有瓶颈,这时候配合redis就有一定 ...

  8. Redis 实战 —— 04. Redis 数据结构常用命令简介

    字符串 P39 Redis 的字符串是一个有字节组成的序列,可以存储以下 3 种类型的值:字节串(byte string).整数.浮点数. 在需要的时候, Redis 会将整数转换成浮点数.整数的取值 ...

  9. redis的常用命令01

    启动redis的命令: redis-server redis.windows.conf把redis设置成windows下的服务的命令:输入命令后刷新会出现redis的服务:redis-server - ...

随机推荐

  1. ESXI 7.0.0 U2 部署

    文章目录 什么是ESXI? ESXi 的优势 功能特性 部署ESXI 创建虚拟机 开始安装 打开浏览器输入ip进行管理 什么是ESXI? ESXI官网:https://www.vmware.com/c ...

  2. Django视图与模板(6)

    前面记到数据库与模型(models)有联系,现在记录一下视图与模板,他们两个也有联系. 个人理解:视图就好像一个cpu,比较核心,就是用来处理问题的,又叫业务逻辑处理,他把处理完的结果插入到模板里面, ...

  3. 万能BI工具时代,聊天记录也能做数据分析?

    最近知乎上有个问题火了: 看了高赞的一些答案,最大的感受就是:婚前"泰国.新加坡.印度尼西亚"婚后"玩具.幼儿园.全部都是娃".作为一个适龄青年,也突然对自己结 ...

  4. windev中的内存机制及其与C语言中的内存指针相似性(一)

    windev中的内存机制,是初入windev世界必须要越过的一道高山,以下我的理解和经验未必都对,如有错误或遗漏,以后再纠正或补充!另外,以下内容,咱先谈应用,再说对机制的认识和理解. 一.新建表单, ...

  5. C# Control.BeginInvoke、synchronizationcontext.post、delegate.BeginInvoke的运行原理

    背景 用到的知识点 1.windows消息机制 备注:鼠标点击.键盘等事件产生的消息要放入系统消息队列,然后再分配到应用程序线程消息队列.软件PostMessage的消息直接进入应用程序线程消息队列, ...

  6. spring复合属性名称

    复合属性名称用于属性已经存在实例的时候, 可以对该实例注入属性 但是前提是该属性不能为null, 否则会抛出NullPointerException异常 boss.java package test_ ...

  7. 给页面添加Canvas鼠标光标星星跟随动画特效

    素材来源:https://www.lanrenzhijia.com/others/5024.html 简单说下我自己的步骤: 把<script type="text/javascrip ...

  8. 计算机网络——HTTP

    目录 计算机网络-HTTP篇 HTTP 基本概念 常见状态码 常见字段 Get 与 Post HTTP 特性 HTTP(1.1) HTTP/1.1 HTTPS 与 HTTP HTTP/1.1.HTTP ...

  9. omnet++:使用教程

    学习自:(6条消息) omnet++ 快速入门 | 计算机网络仿真 | omnet++ 入门教程_叶局长的博客-CSDN博客 1.使用omnet仿真的一般步骤 主要有3步: 使用ned(network ...

  10. github通过token提交代码

    github通过token提交代码 生成token 个人头像->Setttings->Developer settings->Personal access tokens->G ...