最新更新
百年沉浮困低谷,莫以今朝度兴衰, 人生终有高飞日,傲振才华过沧海.
Redis 由 Vmware 公司开发, (卧槽 虚拟机)! 因为考虑有没有学习Linux的同学 基础篇使用Windows的Redis入门 后期会进入Linux的Redis学习阶段
有些数据用Mysql这种数据库存储很不nice!譬如一些图片 秒杀活动之类的数据 这个时候就可用用到Redis类似的NoSql来存储了
用内存存储数据的技术 从而提高curd(增删改查)速度
扯句题外话kodachi是一个存储在内存上的系统 黑客们很喜欢使用它 毕竟一个关机键就可以完全清除他们的犯罪历史 遇见危险 直接关机处理 有哪个小可爱会不喜欢呢
运存(内存)空间很小 如何去保存数据呢? 关机就清除数据的话 不就都没了吗?
- 我们先要明白 数据使用频率很高的时候我们称之为 热数据 ,举个栗子, 淘宝的商品 steam的热销 哔咔的推荐本 都算是一种热数据
- 如果我们每次都想看这些数据,我们就不用把他们放在Mysql这样存储大量数据的地方了(虽然Mysql有索引这样的机制 但还是麻烦!) 毕竟放在硬盘的数据怎么都比不过存在内存上的数据
- 反而呢 内存非常贵 (吃鸡火热的时候 一个内存买500了解一下) 为了节约成本 不经常使用叫做冷数据 存放在硬盘里这是很不错的选择
万一哪一天停电没有存储在硬盘的热数据岂不是直接GameOver, 所以我们需要了解一个点 热数据其实不但保存在内存 他也有机会在硬盘中被存储 这里存储在硬盘的热数据就是备份备份
所以加入高速缓存的存储机制是这样的:
如果缓存数据发生变化记得及时 更新到数据库里哦!
如果大量数据只靠一台服务器做告诉缓存似乎没那么靠谱 我们就可以搭建集群 类似HDFS叫做 LAZY_PERSIST 的玩意儿. 一般我们在Docker这种容器中搭建
是一个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的逻辑库 如
select 0
切换到 0 号逻辑库
还有以下命令:
set 新增键值对
get 获取指定key的value
del 删除
clear 清空控制台
flushall 删除所有数据
虽然好用但是简陋!高端程序员的美工都差劲(暴论)
安装 RedisDesktopManager
优化你的眼睛查看更高级的界面
官网收费从别人那里借来的免费网盘链接
百度网盘:https://pan.baidu.com/s/15xVRpCT8mkP2uT8PoBHT3g 提取码:v727
为了不让突然断电的事故导致Redis数据丢失 Redis提供了俩不错的方案
对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 - 每次内存写入 都会写入硬盘
前排提示:
这一章出现的指令很多! 当我们常用的数据指令了 太多了 记不住?
多用就是哈哈
刚开始用记不住,不妨下载一个 Utools 安装插件redis文档 在开发的时候使用Alt+空格输入redis可以快速查找你的指令
比如我要查询列表删除的数据 我就这样:
然后使用多了你就可以得心应手了!
不是广告!!!
redis的数据类型分为 5 种 - 字符串 哈希 列表 集合 有序集合
可以保存文字数字 也可以保存图片等多媒体文件数据
如何保存多媒体文件?
将文件转化为二进制 序列化 即可存储
但是String并不是无穷大的 最大可以保存512MB数据
set
可以设置数据 也可以对已有key进行修改 不用给value引号 Redis不需要他get
获取字符串的数据del
删除数据getrange
strlen
获取字符串的长度setex
设置带有过期时间的kv对(单位秒)psetex
设置带有过期时间的kv对(单位毫秒)mset ...
同时设置多个kv对mget
获取多个k的valueappend
向 k 对应的 value 追加内容 内容为vincr
数字+1incrby
数字+number number∈intincrbyfloat
数字+number number∈floatdecr
数字-1decrby
数字-number number∈intdecrbyfloat
浮点计算不大准确 还是少用最好
hash说白了就是字典这种结构化的数据 在Redis使用hash 有种字典套字典的感觉
使用hash 可以一次性存储多个数据 比如对象的全部属性
hset
-- 在key里定义一个hash的value 并给这个hash的hash_key 设置一个hash_value
hmset -- 类似于mset 同时给一个hash设置多个key
hget -- 获取hash的hash_key的value
hmget -- 类似于hmget
hgetall -- 获取hash所有的kv
hkeys -- 获取hash所有的key
hlen -- 获取hash的key数量
hexists -- 是否存在key字段 (0False 1True)
hvals -- 获取字段值
hdel ... -- 删除多个hash的kv对
其实我们发现了一个规律只要在String的指令前面加上h 在添加一个hash_key的参数基本可以复刻string的操作
猜猜hincrby 和 hincrbyfloat 是什么? 如何用?
列表可以存储多个重复的值 他和Java的数组(但是你不用定义长度) python的列表有些类似
猜猜 现在dname列表种存储的元素是哪些 顺序如何
你可以使用lrange查看列表数据
类似于Python的集合 和列表一致 不过不能存储重复字段而且无序
顾名思义 可以排序的集合
5 10 表示 5<= x <= 10
(10 表示 小于10
+inf 表示无穷大
-inf 表示负无穷大
同理, ZrevrangebyScore表示降序 参数和升序一致
还记得Mysql的事务吗,记不得了? 没事 redis的事务机制和Mysql不同
但是还是推荐你去复习一下Mysql的事务…
mysql这一类 的数据库的事务是为了防止数据在进行操作的过程中发生了意外的宕机而出现的数据错乱问题所以引入的事务机制 undo
redo
redis本身不需要对数据进行持久化,所以redis也不需要向mysql这样的事务机制,在redis中失败就是失败成功就是成功 没有原子性的说法。
redis的事务可以这么理解
Redis 不会给数据来个锁来保证数据被多个请求所修改的事情发生,而是使用一个数据监视来监视数据,如果事务在执行过程中,其他的客户端修改了监视的记录那么当前的事务会自动的关闭。只有监视的数据没有被其他客户端修改的时候,事务才会执行完成。
watch
监视的数据可以是一条可以是多条
使用 multi
启动事务 使用 exec
提交事务
开启事务后操作不会立即执行 而是在提交事务时候一同执行(类似批处理)
redis的事务没有回滚机制 所以不存在原子性 当事务提交之后不能进行回滚的操作,但是在事务提交之前我们随时可以使用discard取消事务。
既然学习了这么多的命令 不妨来做个小demo 假设设计一个网络购物平台 只有下单前10名的用户才可以拿到数据 记录他们的名字与购买序号!