Redis的学习之路
应用场景
1.作为缓存使用
(1)原始业务功能设计
- 秒杀
- 双十一、618
- 排队购票
(2)运营平台察觉到突发式高频访问热点
- 突发式热点新闻
(3)高频复杂的统计数据
- 在线直播
- 投票排行榜
2.附加功能
(1)系统功能优化或升级
- 单服务器升级集群
- Session管理
- Token管理
主要内容
一、常用的5种数据存储类型
- String --类比Java中的String
- hash --类比Java中的HashMap
- list --类比Java中的LinkedList
- set --类比Java中的HashSet
- sorted_set --类比Java中的TreeSet
1.数据存储类型String基本操作-单指令与多指令
Redis自身是一个Map,其中所有的数据都是采用key:value形式来存储。
key永远都是字符串,而这里所涉及的数据存储类型指的都是value。
- 存储的数据:单个数据,最简单的数据存储类型,也是最常用的。
- 存储格式:一个存储空间保存一个数据。
- 存储内容:通常使用字符串,如果字符串以整数形式展示,可以作为数字操作使用,但其本质上还是字符串。
(1)添加/修改数据
set key value
(2)获取数据
get key
(3)删除数据
delete key
这里需要注意的是Redis删除成功的时候这里返回值为(Integer) 1,删除失败返回值为(Integer)0 。
(4)添加/修改多个数据
mset key1 value1 key2 value2 key3 value3 ...
(5)获取多个数据
mget key1 key2 key3...
(6)获取数据字符个数(字符串长度)
strlen key
(7)追加信息到原始信息后部(如果存在则拼接在后部,不存在则新建)
append key value
(8)这里单独提一下set 和mset的区别,执行效率上,举一个例子:如果我想执行三条set命令,分别要进行发送、执行、返回结果的过程,假设发送指令和返回结果指令所需时间都是s,这两个过程各自需要三次,执行命令所需时间为x,需要三次,那么总时间需要6s+3x。那么多指令执行mset,发送指令需要一次,执行需要三次,返回结果需要一次,那么总时间就是2s+3x。好像多指令mset在多个set值的时候效率高于set,其实这是要结合实际情况来决定发送方法,如果要发50条指令,用mset比较合适,如果要发1亿条指令呢,mset的数据量会很庞大,单线程阻塞了,所有人都等它执行完,反而起到反作用。因此,我们在实际数据量大的时候可以对数据进行适当的切割。
2.数据存储类型String扩展操作-数据增减操作
业务场景:大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键id必须保证统一性,不能重复,Oracle数据库具有sequence设定,可以解决该问题,但是MySQL数据库并不存在类似的机制,那么该如何解决呢?
这里就要介绍一下Redis中的一些指令来代替。
解决方案:
- 设置数值数据增加指定范围的值
incr key
incrby key increment
incrbyfloat key increment
(1)incr用法:
(2)incrby key increment:指定增加的步长
(3)incrbyfloat key increment:指定增长的小数
- 设置数值数据减少指定范围的值
decr key
decrby key increment
(4)decr用法:
(5)decrby key increment:指定减少的步长
这里补充一下:incrby和decrby后面的increment的数可以为正,可以为负,也就是说incrby后如果步长是负数,则可以做到减的效果。
String作为数值操作
- String在Redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
- Redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
- 注意:按数值进行操作的数据,如果原始数据不能转成数值,或者超过了Redis数值上限范围,将报错。(9223372036854775807:java中Long型数据最大值,Long.MAX_VALUE)
3.数据时效性设置
业务场景
- 海选微信投票,每个微信号每6个小时只能投一票
- 电商商家开启热门商品推荐,每个商品拥有3天热门推荐时间,3天后取消热门
- 热点新闻有时效性,控制新闻的时效性
Redis提供以下指令:
- 设置数据具有指定的生命周期
setex key seconds value
psetex key milliseconds value
用法:
下面的毫秒指令与此相似,不做演示。
4.string类型使用注意事项与key的命名规范
(1)注意事项
- 数据操作不成功的反馈与数据正常操作之间的差异
a.表示运行结果是否成功
(integer)0 ---> false 失败
(integer)1 ---> true 成功
b.表示运行结果值
(integer)3 --->3 3个
(integer)1 --->1 1个
- 数据未获取到
(nil)等同于null
- 数据最大存储量
512MB
- 数值计算最大范围(java中long的最大值)
9223372036854775807
(2)String类型的业务场景
主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数和微博数量
这里的原因是任何人点进这个微博大V主页,都必定会显示粉丝数、微博数量、关注量。
命令规范1
这里举个栗子:表名:主键:主键值:属性名
key--->user:id:1001:fans
value--->1221
命名规范2
如果是json格式将一整个对象传入value呢?
再举个栗子:表名:主键:主键值
key--->user:id:1001
value--->{id:1001,blogs:789,fans:1221}
待续。。。。
Redis的学习之路的更多相关文章
- Redis——学习之路四(初识主从配置)
首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...
- Redis——学习之路三(初识redis config配置)
我们先看看config 默认情况下系统是怎么配置的.在命令行中输入 config get *(如图) 默认情况下有61配置信息,每一个命令占两行,第一行为配置名称信息,第二行为配置的具体信息. ...
- Redis——学习之路二(初识redis服务器命令)
上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息 s ...
- Redis学习之路(000)- 目录
本文是博主学习整理网上大神的文件以及自学的心得. Redis学习之路(000)- 目录 Redis学习之路(001)- Redis介绍以及安装(Linux) Redis学习之路(002)- Ubunt ...
- FastAPI 学习之路(五十六)将token存放在redis
在之前的文章中,FastAPI 学习之路(二十九)使用(哈希)密码和 JWT Bearer 令牌的 OAuth2,FastAPI 学习之路(二十八)使用密码和 Bearer 的简单 OAuth2,Fa ...
- FastAPI 学习之路(五十五)操作Redis
之前我们分享了操作关系型数据库,具体文章, FastAPI 学习之路(三十二)创建数据库 FastAPI 学习之路(三十三)操作数据库 FastAPI 学习之路(三十四)数据库多表操作 这次我们分享的 ...
- 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问
中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...
- Go语言学习之路
我关于Go语言的博客原本发布于我的个人网站:wwww.liwenzhouu.com.但是被某些人抄怕了,没办法只好搬运到博客园. 我的Go语言学习之路 2015年底我因为工作原因接触到了Go语言,那时 ...
- 【SpringCloud之pigx框架学习之路 】2.部署环境
[SpringCloud之pigx框架学习之路 ]1.基础环境安装 [SpringCloud之pigx框架学习之路 ]2.部署环境 1.下载代码 git clone https://git.pig4c ...
随机推荐
- http协议请求报文与响应报文分析
什么是HTTP协议: HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到 不断地完善和扩展.目前在WWW中使用 ...
- R 正态性检验:正态概率图
检验模型是否满足正态性假设的方法: 1.正态概率图 这是我编写的画正态概率图的函数: #绘制正态概率图 plot_ZP = function(ti) #输入外部学生化残差 { n = length(t ...
- java实现下划线转驼峰
废话少说,直接上代码 import java.util.regex.Matcher; import java.util.regex.Pattern; public class Temp { publi ...
- uboot源码分析2-启动第二阶段
一.背景知识 1.uboot第二阶段应该做什么? 概括来讲uboot第一阶段主要就是初始化了SoC内部的一些部件(譬如看门狗.时钟),然后初始化DDR并且完成重定位. 由宏观分析来讲,uboot的第二 ...
- 树莓派—raspbian软件源
零.一键换源 2018.05.18更新:新的默认源为raspbian.raspberrypi.org 因此一键换源相应改为 sudo sed -i 's#://raspbian.raspberrypi ...
- NIO三大组件简介
NIO简介 NIO 是面向缓冲区(或者说面向块)编程的, 因为Buffer底层本质上就是内存块.数据被读取到一个缓冲区, 稍后再被它处理, 需要时数据可在缓冲区前后移动, 从而增加了处理过程中的灵活性 ...
- ACM-吴奶奶买鱼
题目描述:吴奶奶买鱼 吴奶奶有个可爱的外孙女——琪琪,她很喜欢小动物,尤其喜欢养鱼.为了让小孙女养到漂亮的小鱼,吴奶奶一大早就到花鸟鱼虫市场买鱼.这个市场可真大,里面有各种各样的宠物,就连宠物鱼都 ...
- POJ 3692:Kindergarten 求补图的最大点独立集 头一次接触这样的做法
Kindergarten Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5884 Accepted: 2877 Desc ...
- 官网英文版学习——RabbitMQ学习笔记(四)Work queues
工作队列:把每个任务只发送给一个工作者. 上一篇我们是从一个指定的队列发送接收消息,在本文中,我们将创建一个工作队列,用于在多个工作者之间分配耗时的任务. 工作队列(即任务队列)背后的主要思想是避免立 ...
- Vue - 项目配置 ( element , 安装路由 , 创建路由 )
1,安装element : vue add element 2,安装路由 : vue add router 3,创建路由的过程 : (1) 新建 vu ...