一文解决redis基础

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.csdn.net/xmh_1997/article/details/123003881?spm=1001.2014.3001.5501
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值