redis基本存储类型
- hash(哈希)
- list (列表)
- string (字符串)
- set (集合)
- zset (有序集合)
为什么要用redis做缓存
- redis 所有数据存储在内存中,相对于磁盘读、写速度快很多。用redis做缓存可以加快访问速度。
redis 可以用作?
- 作为缓存系统
redis可以为每个键设置生存时间,生存时间 到期后会自动删除,这一功能配合出色的性能能让redis可以作为缓存来使用,作为缓存系统,redis还可以限定数据占用的最大空间
,在数据达到空间限制后可以按照一定的规则自动淘汰。 - 作为队列系统
redis的列表类型键可以实现队列,并且支持阻塞式读取,可以很容易实现一个高性能的优先级队列。 - “ 发布 / 订阅 ” 功能
redis还支持“ 发布 / 订阅 ” 的消息模式,可以基于此构建聊天室系统等。
redis特点?
- 读写性能优异
- 持久化
- 数据类型丰富
- 单线程
- 数据自动过期
- 发布 / 订阅
- 分布式
应用场景
- 缓存系统
- 排行榜
- 计数器
- 分布式会话
- 分布式锁
- 社交网络
- 最新列表
- 消息系统
- 秒杀与redis结合
redis基础语法
注意:redis不区分大小写
- hash(哈希)
HSET myhash a 1 // 设置hash值
HMSET myhash a 1 b 2 c 3 // 批量设置
HKEYS myhash // 获取myhash里面的key
HLEN myhash // 获取myhash里面的个数
HDEL myhash a b // 删除myhash 里面的值
DEL myhash // 删除myhash
- list (列表 双向链表)
LPUSH mylist a b // 插入元素a b
LRANGE mylist 0 -1 // 显示所有的
LINSERT mylist BEFORF a a1 // 在mylist a 之前插入 a1
LINSERT mylist AFTER a a2 // 在mylist a之后插入 a2
RPUSH mylist 1 2 3 // 把1、2、3插入右侧
LSET mylist index hello // 给index位置上的元素设置值,值不能超过最大索引
LINDEX mylist 0 // 查询mylist 中索引是0 的值
LLEN mylist // 列表长度
LPOP mylist // 弹出第一个值
RPOP mylist // 弹出最后一个值
LREM key count VALUE
COUNT 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
- string (字符串)
SELECT index // 选择数据库
SET key value // 设置值
GET key // 获取值
GETSET key newvalue // 重新赋值并获取原来的值
SETNX key value // 只有key不存在的时候才设置值
MSET key1 value1 key2 value2 // 设置多个值
// 字符串查询
GET key // 获取值
GETRANGE key start end // 获取key值中字符串的start 到 end的字段
STRLEN key // 获取字符串的长度
EXISTS key // 是不是存在key
EXISTS key1 key2 key3 // 存在几个key就输出几
// 字符串修改
SET key value // 直接赋值即可,有就修改,没有就创建
GETSET key newvalue // 重新赋值并获取原来的值
// 删除
DEL key // 删除key
DEL key1 key2 // 删除多个key
// 当是数字值的时候
SET count 1
GET count
INCR count // 自增1
INCRBY count num // 自增 num
DECR count // 自减 1
DECRBY count num // 自减 num
- set (有序 集合 )
SADD myset 1 2 3 4 5 6 7 7 7 // 添加
SMEMBERS myset // 获取myset里面的值
SCARD myset // 获取总数
SISMEMBER myset abc // 是否存在abc
SRANDMEMBER myset // 获取myset里面的一个随机值
SRANDMEMBER myset 2 // 获取myset里面的两个随机值
SREM myset a b // 删除myset里面的a,b值
SPOP myset // 随机移除
// 集合之间的运算
SDIFF myset myset2 // myset - myset2
SDIFF myset2 myset // myset2 - myset
SINTER myset myset2 // 交集
SUNION myset myset1 // 并集
SDIFFSTORE myset3 myset myset2 // 差集存储到myset3
- sorted set (有序集合)
有序集合每个元素都关联一个分数
有序集合可以用作:
(1)排行榜
(2)微博热搜
可查看实例:https://blog.csdn.net/xmh_1997/article/details/123003881?spm=1001.2014.3001.5501
// 基础语法
ZADD heros 67 jack // heros 里面添加值并赋一个分数67
ZADD heros 100 mike 200 jone
ZEANGE heros 0 -1 // 显示所有数据
ZRANGE heros 0 -1 WITHSCORES // 显示所有数据并携带分数
ZREVRANGE heros 0 -1 WITHSCORES // 显示所有数据按照分数倒叙
ZRANGEBYSCORE heros 60 90 // 查询分数在60 到90 之间的数据
ZREVRANGEBYSCORE heros 90 60 // 逆序输出90到60之间的数据
ZRANK heros jack // 获取jack的排名
ZINCRBY heros 10 jack // 给jack +10
ZREM heros jack // 移除jack
KEYS * // 显示所有的key (hash、list、string、set、sorted set)
KEYS my* // 查询开头是my的key
TYPE key // 查看key的类型
EXISTS foo heros // 有几个key存在就返回几
RENAME myset myset5 // 重命名
RANDOMKEY // 随机key
MOVE heros 1 // 把heros 移动到数据库1
// redis过期时间
适用:限时优惠活动、缓存或者验证码
EXPIRE key seconds // 以秒设置key的过期时间
TTL key // 查看剩余过期时间,过期后会被移除
// -2 过期删除
// -1 没有过期时间
// >0 表示还有多少秒
PERSTST key // 移除过期时间设置
事务: 1.原子性,事务要么全部完成,要么全部取消.
2.一致性,只有合法的数据(依照关系约束和函数约束)才能写入数据库。
3.隔离性,如果两个事物同时运行,两者互不干扰。
4.持久性,一旦事务提交,不管发生什么(崩溃或者出错)数据要保存在数据库中。
转账确保钱不会凭空消失:用到原子性和隔离性
- 处理事务
// 初始数据
SET jack 10
SET rose 20
// jack 转账 5 元 给 rose此时就要开启事务
MULTI // 开启事务
DECRBY jack 5 // jack -5
INCRBY rose 5 // rose +5
EXEC // 提交事务
DISCARD // 取消事务
// 事务中的错误处理
有语法错误的事务中,整个事务直接失败
运行错误。如果事务中出现错误,其他命令仍然会执行
事务中WATCH 命令:作用监视一个(或多个key),
如果在事务执行之前这个或者这些key被改动,那么事务将被打断
// 设置初始balance
SET balance 100
WATCH balance // 监视事务
MULTI // 开启事务
DECRBY balance 10
DECRBY balance 20
EXEC // 如果在这之前,对balance进行修改了,提交这个事务就会失败
UNWATCH balance // 取消监视
- redis持久化
RDB持久化:根据指定的规则“定时”将内存中的数据存储在硬盘上。
在重启之后硬盘上的.rdb快照文件会将数据恢复到内存中。
AOF持久化:AOF持久化记录服务器执行的所有写操作命令形成.aof日志,文件保存在硬盘中,并在服务器启动时,通过重新执行这些命令来还原数据集。
******** RDB持久化, 默认RDB模式
RDB 方式的持久化时通过快照完成的,当符合一定条件时,Redis会自动将内存中的数据生成一份副本并存储在硬盘上,这个过程即为快照。
Redis允许用户自定义快照条件,当符合快照条件时,Redis会自动执行快照操作。进行快照的条件由用户在配置文件中自定义,由两个参数构成,时间窗口M和改动的键的个数N。每当时间M内被改动的个数大于N时,即符合自动快照条件。
******* AOF持久化
AOF 可以将Redis执行的每一个写命令操作日志存储在硬盘文件中,这一过程显然会降低Redis性能,
但是大部分情况下是可以接受的,另外使用较快硬盘可以提高AOF性能。
AOF机制对于日志的写入操作采用的是append模式因此在写入过程中如果出现宕机问题,也不会破坏已经写入的数据。
* .conf // 打开配置文件
* appendonly yes // 改成yes
* appendfilename "文件名称" // 根据自己需要修改
*
* 三种同步策略
* appendfsync always // 执行一次 同步一次
* appendfsync everysec // 每秒同步一次,效率高, 但宕机可能会丢失数据 默认是每秒同步
* appendfsync no // 不同步
*
* redis-cli shutdown
* redis-server .conf
*************** RDB VS AOF
RDB:
优点:文件小(只存数据);异步备份,性能好(异步);恢复大数据集速度快。
缺点:数据安全性低,容易丢失数据(宕机),数据量比较大时,备份速度慢。
AOF
优点:数据安全性高(每一秒同步或者写入就同步);有利于开发分析。
缺点:相同数据集比RDB文件大;
根据所使用的fsync策略,AOF速度可能会慢于RDB。
一般来说,如果想达到足以媲美关键性数据库的安全性,应该两种都用上。
能承受数分钟的数据丢失用RDB
RDB恢复数据集的速度比AOF快
- node.js中使用Redis
npm i ioredis --save
const ioredis = require('ioredis');
const redis = new ioredis({port:637,
hoset:127.0.0.1});
// 操作数据库
redis.set(key, value,(err,result)=>{
if(err){
}
});
redis.sadd()
redis.lpush()
redis.get()
****** 使用pipeline提高效率
const pipline = redis.pipline();
for(let i=0;i<100;i++){
pipline.get(`${i}`,i); // 写入数据,并不执行
}
const ret = pipline.exec() // 现在执行 并不是事务 只是多条命令提高效率
********** multi 事务 如何事务中有错误,就不会执行任何程序
redis.multi()
.set('jack',100)
.set('jone', 200)
.exec() //执行事务
new ioredis({
port:6379,
host:'127.0.0.1',
showFreoendlyErrorStack:true, // 用来显示redis的错误位置 用于调试,会降低性能
});
- egg + redis 实例请看:https://blog.youkuaiyun.com/xmh_1997/article/details/123003881?spm=1001.2014.3001.5501