Redis基础篇 高速缓存技术与Redis的庐山真面目 AUTHOR:LBY
随着第一次外包的缓存雪崩 让我意识到该重新学习Redis这个技术栈了 这次励精图治 重头来过!
最新更新
- 8.24 创建
- 8.25 更新第二章 客户端的使用以及配置参数
- 8.25 Redis的数据 事务
百年沉浮困低谷,莫以今朝度兴衰, 人生终有高飞日,傲振才华过沧海.
什么是Redis
Redis 由 Vmware 公司开发, (卧槽 虚拟机)! 因为考虑有没有学习Linux的同学 基础篇使用Windows的Redis入门 后期会进入Linux的Redis学习阶段
NoSql 的简介
有些数据用Mysql这种数据库存储很不nice!譬如一些图片 秒杀活动之类的数据 这个时候就可用用到Redis类似的NoSql来存储了
高速缓存技术
用内存存储数据的技术 从而提高curd(增删改查)速度
扯句题外话kodachi是一个存储在内存上的系统 黑客们很喜欢使用它 毕竟一个关机键就可以完全清除他们的犯罪历史 遇见危险 直接关机处理 有哪个小可爱会不喜欢呢
运存(内存)空间很小 如何去保存数据呢? 关机就清除数据的话 不就都没了吗?
- 我们先要明白 数据使用频率很高的时候我们称之为 热数据 ,举个栗子, 淘宝的商品 steam的热销 哔咔的推荐本 都算是一种热数据
- 如果我们每次都想看这些数据,我们就不用把他们放在Mysql这样存储大量数据的地方了(虽然Mysql有索引这样的机制 但还是麻烦!) 毕竟放在硬盘的数据怎么都比不过存在内存上的数据
- 反而呢 内存非常贵 (吃鸡火热的时候 一个内存买500了解一下) 为了节约成本 不经常使用叫做冷数据 存放在硬盘里这是很不错的选择
万一哪一天停电没有存储在硬盘的热数据岂不是直接GameOver, 所以我们需要了解一个点 热数据其实不但保存在内存 他也有机会在硬盘中被存储 这里存储在硬盘的热数据就是备份备份
所以加入高速缓存的存储机制是这样的:
- 去应用程序里找数据(变量, 列表之类的简单数据)
- 没在App找到,辨认这个数据是否为热数据,
- 是的话就去缓存中查找(redis),冷数据就去 数据库查找
- 实在找不到你在HDD里找找?
如果缓存数据发生变化记得及时 更新到数据库里哦!
使用案例
- 买的火爆的商品数据在redis中,买的一般的数据在数据库中
- 网红的言论在redis中,普通人的评论在数据库中
- 这不是流量的限流,只是为了让更多人加载网红的言论速度更快,普通人的评论似乎没那么多人去看加载快不快与我无关~
- 区别对待是吧 好家伙
- 超大量(上亿万)的数据请求提交的时候 先交给集群们
- 集群们先暂存数据拿到数据之后等到请求来到低谷期在上传到Mysql类数据库
- 高速缓存是并发的 买秒杀物品的时候 抢到之后下单支付明明到了支付界面,但是还是可能会支付失败是因为其他进程线程虽然晚入一步订单界面但是他提前执行了订单操作, 从而自己被挤了下去. 订单失败的人就想 这玩意儿有黑幕!一定是商家自导自演! 引入Redis后 只要提交了数据就是 一个一个执行不会出现插队或者加塞的情况 你可以慢慢下单 甚至插科打诨一段时间再去下单 只要道德允许 Redis就能允行。
集群
如果大量数据只靠一台服务器做告诉缓存似乎没那么靠谱 我们就可以搭建集群 类似HDFS叫做 LAZY_PERSIST 的玩意儿. 一般我们在Docker这种容器中搭建
Redis的介绍
是一个NoSQL数据库产品之一 以键值对的形式进行存储 像JSON 像DICT 像Mapper 由C语言编写(源码开源) 理论可以达到10个w的QPS QPS指的是每秒查询的次数
X轴是链接数 Y轴是一秒查询的次数
安装与服务器的搭建
下载链接https://github.com/tporadowski/redis/releases,下载ZIP即可
现在之后不要打开任何程序 我们需要让redis-server.exe
启动的时候redis.windows.conf
, 但是 exe 默认不会加载任何文件 我们需要写一个Bat文件来实现这样的效果
新建记事本txt:
redis-server redis.windows.conf
写完之后 存储为.bat文件即可
打开bat弹出的cmd类似于下图
基础使用
启动客户端的话可以直接点击redis-cli.exe
运行 界面简陋 见谅 服务器端口默认 6379
默认, Redis有16个逻辑库(0~15) 都是空的 可以存储数据 使用 select <id>
切换到指定id的逻辑库 如
select 0
切换到 0 号逻辑库
还有以下命令:
set <key> <value> 新增键值对
get <key> 获取指定key的value
del <key> 删除
clear 清空控制台
flushall 删除所有数据
虽然好用但是简陋!高端程序员的美工都差劲(暴论)
安装 RedisDesktopManager
优化你的眼睛查看更高级的界面
官网收费从别人那里借来的免费网盘链接
百度网盘:https://pan.baidu.com/s/15xVRpCT8mkP2uT8PoBHT3g 提取码:v727
Redis的持久化
为了不让突然断电的事故导致Redis数据丢失 Redis提供了俩不错的方案
- RDB方案
- 定期存储备份 只有触发一定条件 才会进行同步 比如一分钟读写1000次我就进行同步
- AOF方案
- 日志记录 你写一次我就记录一次 宕机后 使用日志重启就会把操作的记录复刻一次
参数配置
对Redis本身的配置
- port 端口 默认 6379
- bind 默认被注释 表示可以连接数据库的IP地址 推荐是0.0.0.0 表示全部
- 删除空格的时候记得删除空格!
- timeout 超时时间 默认是0 表示没有超时时间
- 长时间不用不关闭也不好 timeout最好设置个数字
- logfile 日志输出的文件名称
- 填写之后记得找到注释并删除注释: syslog-enabled
- 值设置为no就行
- databases 逻辑库的数量
- 默认16
- requirepass
- 密码 默认被注释 建议打开
rdb是内存数据同步到硬盘的数据库文件 有如下操作
- save 同步频率
- 写入包括增删改
- save 60 10000 指的是 在 60s 之内 写入了10000条数据就进行同步
- save 900 1 指的是900内写入了一条数据都可以进行同步
- rdbcompression
- 同步数据采用压缩
- rdbchecksum
- 同步数据校验
- rdbfilename
- rdb文件的名称
- dir
- redis所在的目录、
RDB 同步方案似乎会导致数据的丢失? 我们不妨了解一下AOF的备份方案吧
- maxclients 最大连接数
- 默认无限制 实际环境推荐设置一个大数字
- maxmemory 占用内存的大小
- 默认无限制 实际环境推荐设置一个70%的内存
- appendonly 开始AOF模式
- 默认关闭
- 开启AOF RDB就要关闭 我们只需要删除save命令存在的配置行即可
- appendfsync 同步频率
- no - 不可靠就是了
- everysec - 每秒都会把数据写入到硬盘 不可靠就是了
- always - 每次内存写入 都会写入硬盘
Redis的数据
前排提示:
这一章出现的指令很多! 当我们常用的数据指令了 太多了 记不住?
多用就是哈哈
刚开始用记不住,不妨下载一个 Utools 安装插件redis文档 在开发的时候使用Alt+空格输入redis可以快速查找你的指令
比如我要查询列表删除的数据 我就这样:
然后使用多了你就可以得心应手了!
不是广告!!!
redis的数据类型分为 5 种 - 字符串 哈希 列表 集合 有序集合
字符串String类型
可以保存文字数字 也可以保存图片等多媒体文件数据
如何保存多媒体文件?
将文件转化为二进制 序列化 即可存储
但是String并不是无穷大的 最大可以保存512MB数据
- 基本指令
set <key> <value>
可以设置数据 也可以对已有key进行修改 不用给value引号 Redis不需要他get <key>
获取字符串的数据del <key>
删除数据
- 高级指令
getrange <key> <index_min> <index_max>
- 截取字符串从index_min到index_max的子串
strlen <key>
获取字符串的长度setex <key> <sec> <value>
设置带有过期时间的kv对(单位秒)psetex <key> <sec> <value>
设置带有过期时间的kv对(单位毫秒)mset <k1> <v1>...<kn> <vn>
同时设置多个kv对mget <k1> <k2>
获取多个k的valueappend <k> <v>
向 k 对应的 value 追加内容 内容为v
- 加法运算
incr <key>
数字+1incrby <key> <number>
数字+number number∈intincrbyfloat <key> <number>
数字+number number∈floatdecr <key>
数字-1decrby <key> <number>
数字-number number∈int- 没有
decrbyfloat
浮点计算不大准确 还是少用最好
哈希Hash类型
hash说白了就是字典这种结构化的数据 在Redis使用hash 有种字典套字典的感觉
使用hash 可以一次性存储多个数据 比如对象的全部属性
hset <key> <hash_key> <hash_value>
-- 在key里定义一个hash的value 并给这个hash的hash_key 设置一个hash_value
hmset -- 类似于mset 同时给一个hash设置多个key
hget <key> <hash_key> -- 获取hash的hash_key的value
hmget -- 类似于hmget
hgetall <key> -- 获取hash所有的kv
hkeys <key> -- 获取hash所有的key
hlen <key> -- 获取hash的key数量
hexists <key> <hkey> -- 是否存在key字段 (0False 1True)
hvals <key> -- 获取字段值
hdel <key> <hkey>...<hkeyn> -- 删除多个hash的kv对
其实我们发现了一个规律只要在String的指令前面加上h 在添加一个hash_key的参数基本可以复刻string的操作
猜猜hincrby 和 hincrbyfloat 是什么? 如何用?
列表list类型
列表可以存储多个重复的值 他和Java的数组(但是你不用定义长度) python的列表有些类似
- rpush key val1 [val2 …] 向某个列表的最右侧添加数据
- lpush key val1 [val2 …] 向某个列表的最左侧添加数据
- lset key index val 向某个列表的索引为index的地方设置数据(index从0开始)
猜猜 现在dname列表种存储的元素是哪些 顺序如何
你可以使用lrange查看列表数据
- llen key 获取长度
- lrange key start_index end_index 查看指定范围的list子串 end_index为负数的时候表示倒数第几个
- lindex key index 获取第几个元素值
- linsert key before|after value1 value2 将value2插入到列表元素value的前面|后面
- lpop key 删除第0个元素(最左的)
- rpop key 删除最后一个元素(最右的)
- lrem key number value 删除列表的指定元素值的值 如果有多个可以使用number指定删除多少个
集合set类型
类似于Python的集合 和列表一致 不过不能存储重复字段而且无序
- sadd key value [value2 vlaue3] 向集合添加元素 可以是多个元素
- smembers key 获取集合所有元素
- scard key 获取集合长度
- sismember key value value是否属于集合
- srem key value 删除元素值
- spop 随机删除一个元素并返回
- srandmember key number 从集合里随机返回number个元素
顺序集合Zset类型
顾名思义 可以排序的集合
- zadd 添加元素并加上权重值
- zincrby 添加元素的权重
- zrevrange 降序排序key
5 10 表示 5<= x <= 10
(10 表示 小于10
+inf 表示无穷大
-inf 表示负无穷大
同理, ZrevrangebyScore表示降序 参数和升序一致
Redis 的Key命令
Redis 事务
还记得Mysql的事务吗,记不得了? 没事 redis的事务机制和Mysql不同
但是还是推荐你去复习一下Mysql的事务…
mysql这一类 的数据库的事务是为了防止数据在进行操作的过程中发生了意外的宕机而出现的数据错乱问题所以引入的事务机制 undo
redo
redis本身不需要对数据进行持久化,所以redis也不需要向mysql这样的事务机制,在redis中失败就是失败成功就是成功 没有原子性的说法。
redis的事务可以这么理解
- 有两个客户端对redis进行请求
- A-cli有两条指令 B-cli也有两个
- ac 向redis发送请求 执行的期间 bc可能也会来请求
- 但是ac值执行到了半途 没有事务的时候 bc可以从中进行插队执行
- 所以我们引入了事务 如果是a先来的 就需要等到a执行完毕之后 b再去执行
- 保证了客户端即使有多个命令也不会被插队的问题不再发生
- 而且redis的事务没有回滚 错误就是错误 正确就是正确
数据监视
Redis 不会给数据来个锁来保证数据被多个请求所修改的事情发生,而是使用一个数据监视来监视数据,如果事务在执行过程中,其他的客户端修改了监视的记录那么当前的事务会自动的关闭。只有监视的数据没有被其他客户端修改的时候,事务才会执行完成。
watch <key> <key2> ...
监视的数据可以是一条可以是多条
事务启动
使用 multi
启动事务 使用 exec
提交事务
开启事务后操作不会立即执行 而是在提交事务时候一同执行(类似批处理)
redis的事务没有回滚机制 所以不存在原子性 当事务提交之后不能进行回滚的操作,但是在事务提交之前我们随时可以使用discard取消事务。
既然学习了这么多的命令 不妨来做个小demo 假设设计一个网络购物平台 只有下单前10名的用户才可以拿到数据 记录他们的名字与购买序号!
更多推荐
所有评论(0)