redis笔记

redis五大类型

redis 的key 都是string类型的, 
所谓的五大类型 string set zset list hash 其实都是value的类型
在这些类型的底层还有更加底层的数据结构,所以redis的存储速度非常快
redis会根据你的value选择最合适的数据结构存储value
例如 set dc 666 和set dc1 66a
type dc 结果 string
type dc1 结果 string
incr dc 结果 667
incr dc1 结果报错
可以 dc和dc1 都是使用的 string类型存储
但在底层redis对于 dc 的value 先强转为int 发现可以转换 直接使用int整形存储 
而dc1 先强转为int类型发现无法转换 则是使用简单字符类型embstr存储
所以dc 进行自增操作 结果是667 而dc1 进行自增操作报错

字符串常用操作

SET key value                   //存入字符串键值对
MSET key value [key value...]   //批量存储字符串键值对
SETNX key value                 //存入一个不存在的字符串键值对
GET key                         //获取一个字符串键值
MGET key [key...]               //批量获取字符串键值
DEL key [key...]                //删除一个键
EXPIRE key seconds              //设置一个键的过期时间(秒)
原子加减
INCR key                        //将key中储存的数字值加1
DECR key                        //将key中储存的数字值减1
INCRBY key increment            //将key所储存的值加上increment
DECRBY key decrement            //将key所储存的值减去decrement

string 用法场景

1计数器 比如统计 文章的阅读次数 incr 文章id 每次文章被点击自增1次
2分布式系统全局序列号  一次连接生成加一次太浪费性能 
直接一次加100 然后把这个数放到系统缓存中,系统缓存从0开始消耗一直到一百, 
用完再去redis获取新的例 : 进入redis incrby id 100 结果100 ,然后拿到系统缓存中,缓存从0开始使用,
每一次加一,直至加到100,然后再到redis中获取一次 redis incrby id 100 结果200,
再次给系统缓存,依次循环,可以在分布式环境下,生成全局使用的自增id

Hash常用操作 key value value里又是key-value

HSET   key field value                      //存储一个哈希表key的键值
HSETNX key field value                      //存储一个不存在的哈希表key的键值
HMSET  key field value [field value...]     //在一一个哈希表key中存储多个键值对
HGET   key field                            //获取哈希表key对应的field键值
HMGET  key field [field...]                 //批量获取哈希表key中多个field键值
HDEL   key field [field...]                 //删除哈希表key中的field键值
HLEN   key                                  //返回哈希表key中field的数量
HGETALL key                                 //返回哈希表key中所有的键值
HINCRBY key field increment                 //为哈希表key中field键的值加上增量increment

hash 使用场景

可以灵活的改变对象中的属性
例 一个user对象 属性 id=1 name=dc age=18
存一个 hset key value[key value]
hset user 1:name dc
hset user 1:age 18
存多个
hmset user id:name id:age
hmset user 1:name dc 1:age 18
取一个
hget user 1:name 得到结果 dc
hget user 1:age 得到结果 18
取多个
hmget user 1:name 1:age 得到结果 dc 18单独对年龄自增
hincrby key 1:age 100 得到结果 118

List常用操作

LPUSH key value [value...]         //将一个或多个值value插入到key列表的表头(最左边)
RPUSH key value [value...]         //将一个或多个值value插入到key列表的表尾(最右边)
LPOP key                           //移除并返回key列表的头元素
RPOP key                           //移除并返回key列表的尾元素
LRANGE key start stop              //返回列表key中指定区间内的元素,区间以偏移量start和stop指定
BLPOP key [key...] timeout         //从key列表表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
BRPOP key [key...] timeout         //从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待常用数据结构(分布式环境下)
Stack(栈)   = LPUSH + LPOP = FILO(first in last out 先进后出)
Queue(队列) = LPUSH + RPOP = FIFO(first in first out 先进先出)
Blocking MQ(阻塞队列) = LPUSH + BRPOP  去取元素时队列里没有元素 会一直阻塞着,直到元素被放入队列 (相当于监听)lpush 左边插入 lpop 左边取出
rpush 右边插入 rpop 右边取出
取出所有元素 lrange key 0 -1pipline 管道 一次性可以执行N条命令 建议不超过1000条

Set常用操作

SADD key member [member...]             //往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM key member [member...]             //从集合key中删除元素
SMEMBERS key                            //获取集合key中所有元素
SCARD key                               //获取集合key的元素个数
SISMEMBER key member                    //判断member元素是否存在于集合key中
SRANDMEMBER key [count]                 //从集合key中选出count个元素,元素不从key中删除
SPOP key [count]                        //从集合key中选出count个元素,元素从key中删除

Set运算操作

SINTER key [key...]                     //交集运算
SINTERSTORE destination key [key...]    //将交集结果存入新集合destination中
SUNION key [key...]                     //并集运算
SUNIONSTORE destination key [key...]    //将并集结果存入新集合destination中
SDIFF key [key...]                      //差集运算
SDIFFSTORE destination key [key...]     //将差集结果存入新集合destination中

使用场景

微信抽奖小程序
1)点击参与抽奖加入集合SADD key {userlD}
2)查看参与抽奖所有用户SMEMBERS key
3)抽取count名 中奖者SRANDMEMBER key [count]  不从key中删除或者 SPOP key [count]    从key中删除
微信微博点赞,收藏,标签
1)点赞SADD like:{消息ID} {用户ID} 把id加入集合中
2)取消点赞SREM like:{消息ID} {用户ID} 把id从集合中删除
3)检查用户是否点过赞SISMEMBER like:{消息ID} {用户ID} 点赞的红心是否高亮
4)获取点赞的用户列表SMEMBERS like:{消息ID}
5)获取点赞用户数SCARD like:{消息ID}
集合操作实现微博微信关注模型
1)诸葛老师关注的人:zhugeSet-> {zhuangzhou, xushu}
2)楼兰老师关注的人:loulanSet--> {zhuge, baiqi, zhuangzhou, xushu}
3)庄周老师关注的人:zhuangzhouSet-> {zhuge, loulan, baiqi, xushu, xunyu)
4)我和楼兰老师共同关注:SINTER zhugeSet loulanSet--> {zhuangzhou, xushu}
5)我关注的人也关注他(楼兰老师):SISMEMBER zhuangzhouSet loulanSISMEMBER xushuSet loulan
6)我可能认识的人:SDIFF loulanSet zhugeSet- > (zhuge, baiqij

ZSet常用操作

 ZADD key score member [score member...]       //往有序集合key中加入 带分值元素ZREM key member [member...]                   //从有序集合key中删除元素ZSCORE key member                             //返回有序集合key中元素member的分值ZINCRBY key increment member                  //为有序集合key中元素member的分值加上incrementZCARD key                                     //返回有序集合key中元素个数ZRANGE key start stop [WITHSCORES]            //正序获取有序集合key从start下标到stop下标的元素ZREVRANGE key start stop [WITHSCORES]         //倒序获取有序集合key从start下标到stop下标的元素Zset集合操作ZUNIONSTORE destkey numkeys key [key...]       //并集计算ZINTERSTORE destkey numkeys key [key...]       //交集计算

Zset集合操作实现排行榜

 1)点击新闻ZINCRBY hotNews:20200819 1总理记者会2)展示当日排行前十ZREVRANGE hotNews:20200819 0 9 WITHSCORES3)七日搜索榜单计算ZUNIONSTORE hotNews:202008 13 - 20200819 7hotNews:20200813 hotNews:202008 14... hotNews:202008194)展示七日排行前十ZREVRANGE hotNews:20200813- 20200819 0 9 WITHSCORES

压缩列表 跳表 哈希表

其他问题

缓存击穿 查询的数据在缓存中不存在 直接去数据库查询 问题 导致数据库服务器压力变大 解决方法 先判断有没有缓存 没有则查询数据库 然后重新设置缓存 并添加过期时间

缓存穿透 查询的数据在缓存与数据库中都不存在 问题 并发过大时数据库服务器可能会宕机 解决方法 为不存在的数据创建空值 并添加过期时间

缓存冷门数据热点重建,原因,原本冷门的数据突然出现高并发访问 问题 并发过大时数据库服务器可能会宕机 解决方法 双重检测锁机制 先检查一遍缓存 缓存中没有 再用jvm锁或redis分布式锁 把查询数据库的代码锁起来(不能让高并发的请求同时穿透到数据库),在同步代码块中再查询一遍缓存,如果缓存中存在则直接返回数据(锁会影响效率,越快结束越好),如果缓存中还是没有才去查询数据库,然后把数据添加到缓存 并添加过期时间 一定要try catch finally 无论情况如何 最终必须解锁

缓存数据库双写不一致问题 修改数据的代码用锁 注意控制粒度 并发大效率低 可以用下边的读写锁优化

分布式锁优化方案 分场景 1读多写少 基于读写锁优化 读写互斥 写写互斥 读读不互斥 redis 的 readwriteLock 读写锁 readLock和writeLock锁同一个id 但读读不会互斥 可以优化

当redis的访问量过大,此时需要使用JVM级别的二级缓存,但jvm级别的缓存又必须要解决数据同步问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/108692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt/C++编写物联网组件/支持modbus/rtu/tcp/udp/websocket/mqtt/多线程采集

一、功能特点 支持多种协议,包括Modbus_Rtu_Com/Modbus_Rtu_Tcp/Modbus_Rtu_Udp/Modbus_Rtu_Web/Modbus_Tcp/Modbus_Udp/Modbus_Web等,其中web指websocket。支持多种采集通讯方式,包括串口和网络等,可自由拓展其他方式。自定义采…

排序算法-基数排序法(RadixSort)

排序算法-基数排序法(RadixSort) 1、说明 基数排序法与我们之前讨论的排序法不太一样,并不需要进行元素之间的比较操作,而是属于一种分配模式排序方式。 基数排序法比较的方向可分为最高位优先(Most Significant Di…

修改51单片机中数组元素的值

在8051单片机中,code关键字用于将数据存储在ROM中。由于ROM是只读的,所以在运行时无法直接修改seven_seg数组中的值。 如果您想在main函数中修改seven_seg[1]的值为0xc0,您可以将seven_seg数组定义为可写的变量,而不是存储在ROM中…

支持语音与视频即时通讯项目杂记(一)

第一部分解释服务端的实现。 (服务端结构) 下面一个用于实现TCP服务器的代码,包括消息服务器(TcpMsgServer)和文件中转服务器(TcpFileServer)。 首先,TcpServer是TcpMsgServer和Tcp…

few shot learnning笔记

课程地址 https://youtu.be/hE7eGew4eeg?siKBM0lY7eY_AdD8Wr PPT地址 https://github.com/wangshusen/DeepLearning 第一节 Few-Shot Learning Basics 第二节 Siamese Network 第三节 Pretraining Fine Tuning(以图像识别举例) 基础 support set&…

上采样相关技术

一、参考资料 上采样和上卷积的区别 怎样通俗易懂地解释反卷积? 卷积和池化的区别、图像的上采样(upsampling)与下采样(subsampled) [读论文]用全卷积Res网络做深度估计 对抗生成网络GAN系列——DCGAN简介及人脸图像生…

MapReduce任务个数如何影响执行效率?性能优化从这里做起

在正文开始之前,请先来回答一下这个问题: 题目:输入为3个文件,a.txt 300MB,b.txt 100MB,c.txt 58.MB,使用MapReduce的example程序,计算Wordcount,请问,应该有多少个MapTask&#xf…

算法、推理、部署,面了40多个大佬的感想

今年三月份到现在陆陆续续面了40来个人,有实习生,有校招生,也有来社招的大佬们。面了挺久,有些总结和感想,发出来和大家交流交流,也趁着这个机会为之后参与校招的同学提供一些学习方向。 我面的岗位主要是…

计算机网络第2章-CDN(4)

视频流和内容分发网 HTTP流和DASH 在HTTP流中,视频只是存储在HTTP服务器中作为一个普通的文件,每个文件有有一个特定的URL。当用户要看视频时,客户与服务器之间创建一个TCP连接并发送HTTP GET请求。 HTTP流具有严重缺陷,即所有…

Windows系统创建Python虚拟环境

文章目录 1 创建虚拟环境的方法2 如何激活环境2.1 目录解读2.2 激活环境和安装第三方库 3 py源文件存放位置4 写在最后 1 创建虚拟环境的方法 在Windows上创建Python虚拟环境的常用方法有以下几种: 使用venv模块创建(官方推荐) Python内置的venv模块可以…

【大数据 - Doris 实践】数据表的基本使用(二):数据划分

数据表的基本使用(二):数据划分 1.列定义2.分区与分桶2.1 Partition2.1.1 Range 分区2.1.2 List 分区 2.2 Bucket2.3 使用复合分区的场景 3.PROPERTIES3.1 replication_num3.2 storage_medium3.3 storage_cooldown_time 4.ENGINE 1.列定义 列…

quartz中jdbc.initialize-schema

never:从不进行初始化,也就是不清空数据库 always:每次都清空数据库进行初始化 embedded:只初始化内存数据库(默认值)

【扩散模型从原理到实战】Chapter2 Hugging Face简介

文章目录 Hugging Face的核心功能介绍Hugging Face开源库Hugging Face开源库Gradio工具介绍参考资料 Hugging Face是机器学习从业者协作和交流的平台,成立于2016年,在纽约和巴黎设有办事处,团队成员来自世界各地,远程办公。 致力于…

基于SSM的旅游信息管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Nacos源码 (7) Nacos与Spring

SpringCloud工程可以使用Nacos作为注册中心和配置中心,配置和使用非常简单,本文将简单介绍使用方式,并分析其实现方式。 SpringCloud工程集成Nacos SpringCloud工程使用Nacos非常简单,只需要引入依赖、编写配置参数、在启动类上…

多数元素[简单]

优质博文:IT-BLOG-CN 一、题目 给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数大于n/2的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入:nums [3,2,3…

堆排序代码模板

#include<iostream> using namespace std; const int N 1e5 9; int h[N], n, m, Size;//小根堆//u表示三个点中的根节点 void down(int u) {int t u;//设t为三个点中最小的那个点//如果左儿子存在并且小于根节点就将左儿子赋值给tif (u * 2 < Size && h[u …

什么是著作权?对此你了解多少?

在当今信息爆炸的时代&#xff0c;著作权成为一个备受关注的话题。创作是人类文明的重要组成部分&#xff0c;而著作权是创作者对自己作品的劳动和智慧的一种保护。很多人还不太了解著作权&#xff0c;那么希望看完此文&#xff0c;你会对它有一个新的认识。 一、著作权的概念 …

Java —— 运算符

目录 1. 什么是运算符 2. 算术运算符 2.1 基本四则运算符: 加减乘除模( - * / %) 2.2 增量运算符 - * %与 自增/自减运算符 -- 3. 关系运算符 4. 逻辑运算符 4.1 逻辑与 && 4.2 逻辑或|| 4.3 逻辑非 ! 4.4 短路求值 5. 位运算符 5.1 按位与 & 5.2 按位或 5.3 按位…

Kotlin let run with apply also 关键字

Kotlin let run with apply also 关键字 参考官网学习资料 https://play.kotlinlang.org/byExample/06_scope_functions/ 一、 let Kotlin 标准库函数 let 可用于范围界定和空检查。当在对象上调用时&#xff0c;let 执行给定的代码块并返回其最后一个表达式的结果。该对象可…