Redis 基础

目录

一、Redis 介绍

1.Redis的全局命令

2.数据结构

3.Redis的线程架构

二、字符串

1.介绍

2.命令

3.批量操作和单个操作效率对比

4.内部编码

5.使用场景:

三、哈希

1.介绍

2.命令

四、列表

1.介绍

2.命令

3.使用场景

五、集合

1.介绍

2.命令

3.使用场景:

六、有序集合

1.介绍

2.命令

3.使用场景

七、键管理

1.单个键管理命令

2.遍历键

3.数据库管理

八、Redis的慢查询分析

九、Pipeline

1.概念

十、发布订阅

1.介绍

2.命令

十一、reids经典事件

1.缓存穿透

2.缓存击穿

3.缓存雪崩

一、Redis 介绍

1.Redis的全局命令

1.查看所有键: keys *
2.键总数:dbsize
3.查看键是否存在:exists key   如果键存在返回1,不存在返回0
4.删除键:del key    返回结果为成功删除键的个数,如果删除的键不存在则返回0
5.设置键过期时间:expire key seconds
6.键的数据结果类型:type key    如果键不存在则返回none

2.数据结构

string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)

3.Redis的线程架构

Redis使用了单线程架构和I/O多路复用模型来实现的

(备注:Redis在持久化生成RDB文件的时候通过fork生成了子线程,所以偶尔也是多线程的)

二、字符串

1.介绍

首先Redis的键都是字符串类型的,字符串类型的值可以是:简单的字符串、复杂的字符串(JSON、XML)、数字(整数、浮点数)、甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。

2.命令

1.设置值:set key value [ex seconds] [px milliseconds] [nx|xx]
  例:set hello world    
  ex seconds:为键设置秒级过期时间
  px milliseconds:为键设置毫秒级过期时间
  nx:键必须不存在,才能设置成功,用于添加
  xx:键必须存在,才能设置成功,用于更新
2.获取值:get key  如果要获取的键不存在,返回nil
3.批量设置值:mset key value [key value key value]  
  备注:如果设置的key value过多key放入一个string数组中
4.批量获取值:mget key [key ...]
5.自增:incr key(值不是整数,返回错误;值是整数,返回自增后的结果;键不存在,按照值为0自增返回1)
6.自减:decr key
7.自增制定数字:incrby key increment
8.自减指定数字:decrby key decrement
9.自增浮点数:incrbyfloat key 数值
10.向值字符串尾部追加值:append key value
11.字符串长度:strlen key
12.设置并返回原值:getset key value
13.设置指定位置的字符:setrange key 下标位置 value
14.获取部分字符串:getrange key start end (偏移量从0开始)

 3.批量操作和单个操作效率对比

使用get命令:n次 get时间=n次网络时间+n次命令时间

使用mget命令:n次get时间=1次网络时间+n次命令时间

4.内部编码

int:8个字节的长整型

embstr:小于等于39个字节的字符串

raw:大于39个字节的字符串

5.使用场景:

  • 缓存功能:MySQL作为存储层,Redis作为缓存层,大部分数据都从Redis中获取。如果Redis没有取到在从MySQL中获取,取回来的值存在Redis中一份
  • 计数:通过自增自减功能来实现,用于视频播放次数等
  • 共享Session:将用户的Session放在Redis中统一管理,每次用户更新或者查询登录信息都直接从Redis中获取
  • 限速:通过键是否存在和自增功能来实现

缓存功能:

共享session:

三、哈希

1.介绍

在Redis中,哈希类型指键值本身又是一个键值对结构,形如key:value={{field1,value},{field2,value},{field3,value}}。

2.命令

1.设置值:hset key field value
2.如果field不存在设置值:hsetnx key field value
3.获取值:hget key field
4.删除field:hdel key field [field...]
5.计算field个数:hlen key
6.批量设置或获取field-value:hmget key field [field...]
7.判断field是否存在:hexists key field
8.获取所有field:hkeys key
9.获取所有的value:hvals key
10.获取所有的field-value:hgetall key
11.自增作用域是field:hincrby key field/ hincrbyfloat key field
12.计算value的字符串长度:hstrlen key field

四、列表

1.介绍

列表类型是用来存储多个有序的字符串,列表中的每个字符串称为元素。在Redis中,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定下标的元素,它可以充当栈和队列的角色

特点:1.有序  2.可以重复

2.命令

1.从右边插入元素:rpush key value [value...]
2.从左边插入元素:lpush key value [value...]
3.向某个元素前或者后插入元素:linsert key before|after 现有value value
4.获取指定范围内的元素列表:lrange key start end 
  特点:索引下标从左到右分别是0到N-1;从右到左分别是-1到-N;end包含自身
5.获取列表指定索引下标的元素:lindex key index
6.获取列表长度:llen key
7.从列表左侧弹出元素:lpop key
8.从列表右侧弹出元素:rpop key
9.删除指定元素:lrem key count value
  备注:count>0,从左到右删除最多count个元素;count<0,从右到左删除最多count绝对值个元素;count=0, 
       删除所有
10.按照索引范围修剪列表:ltrim key start end
11.修改指定索引下标元素:lset key index newValue
12.阻塞式弹出:blpop key [key...] timeout
13.阻塞式弹出:brpop key [key...] timeout

3.使用场景

  • 消息队列:Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用 lpush从列表左侧插入元素,消费者客户端使用brpop命令阻塞式抢列表尾部的元素
  • 栈:入口、出口在同一边
  • 队列:入口、出口在不同边

五、集合

1.介绍

集合类型也是用来保存多个字符串元素,不允许有重复的元素并且是无序的,不能通过索引下标获取。

2.命令

1.添加元素:sadd key element [element...]
2.删除元素:srem key element [element...]
3.计算元素个数:scard key   不会遍历集合的所有元素,直接用Redis内部的变量
4.判断元素是否在集合中:sismember key element  如果在返回1,不在返回0
5.随机从集合返回指定个数元素:srandmember key [count]    count是可选参数,如果不写默认1
6.从集合随机弹出元素:spop key
7.获取所有元素:smembers key
8.求多个集合的交集:sinter key [key...]
9.求多个集合的并集:suinon key [key...]
10.求多个集合的差集:sdiff key [key...]

3.使用场景:

标签:给用户添加标签、给标签添加用户

六、有序集合

1.介绍

它保留了集合不能重复的特性,但是有序集合中的元素是可以排序的。它给每个元素设置一个分数score作为排序的依据。key->score->member

2.命令

1.添加成员:zadd key score member [score member...] 
2.计算成员个数:zcard key
3.计算某个成员分数:zscore key member
4.计算成员的排名:zrank key member从低到高排 zrevrank key member从高到低排
5.删除成员:zrem key member [member...]
6.增加成员的分数:zincrby key increment menmber
7.返回指定排名范围的成员:zrange key start end [withscores]从低到高  zrevrange从高到底
8.返回指定分数范围的成员个数:zcount key min max

3.使用场景

将班级的下列学生得分存入Redis的SortedSet中: Jack 85,Lucy 89,Tom 82, Tom 95,Jerry 78,Amy 92,Miles 76

七、键管理

1.单个键管理命令

1.键重命名:rename key newkey
2.键过期:expire key seconds 键在seconds秒后过期

2.遍历键

1.全量遍历键:keys pattern

3.数据库管理

1.切换数据库:select dbIndex
2.清除数据库:
flushdb:只清除当前数据库
flushall:会清除所有数据库

八、Redis的慢查询分析

Redis执行命令分为:发送命令->命令排队->命令执行->返回结果。慢查询只统计第三步命令执行的时间,所以没有慢查询日志不代表客户端没有超时问题

配置:

  1. 预设阈值(slowlog-log-slower-than):默认值是10000微秒,如果执行命令时间超过10000,就会被记录进慢查询日志中
  2. 慢查询记录存放:Redis使用列表来存储慢查询日志,slowlog-max-len就是列表的最大长度。当慢查询日志列表达到最大长度的时候,最早插入的命令会从列表中移除。

慢查询日志获取:

1.获取慢查询日志:slowlog get [n]   其中n可以指定条数
2.获取慢查询日志列表当前长度:slowlog len
3.慢查询日志重置:slowlog reset

九、Pipeline

1.概念

它能将一组Redis命令进行组装,通过一次网络传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端

jedis删除:
public static void delNoStus(String... keys) {
    Jedis jedis = new Jedis(RedisTools.ip, RedisTools.port);
    //在循环中进行批量删除
    for (String key : keys) {
        jedis.del(key);
    }
    jedis.close();
}
jedis使用pipelined技术删除:
public static void delNoPipe(String... keys) {
    Jedis jedis = new Jedis(RedisTools.ip, RedisTools.port);
    Pipeline pipelined = jedis.pipelined();
    for (String key : keys) {
        pipelined.del(key);//封装未提交
    }
    pipelined.sync();//一次性提交
    jedis.close();
}

十、发布订阅

1.介绍

Redis提供了基于发布、订阅模式的消息机制,此模式下消息发布者和订阅者不进行直接通信,发布者客户端向指定频道发布消息,订阅该频道的每个客户端都可以收到该信息。

2.命令

1.发布消息:publish channel message
2.订阅消息:subscribe channel [channel...]
3.取消订阅:unsubscribe [channel [channel ...]]
4.按照模式订阅和取消订阅:
psubscribe pattern [pattern...]订阅
punsubscribe [pattern [pattern...]]取消订阅
5.查看订阅
查看活跃的频道:pubsub channels [pattern]
查看订阅频道数:pubsub numsub [channel]
查看模式订阅数:pubsub numpat

十一、reids经典事件

1.缓存穿透

缓存穿透是指客户端请求的数据在redis缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

解决办法:缓存空对象

2.缓存击穿

缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。 

3.缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案:

  • 利用Redis集群提高服务的可用性
  • 给业务添加多级缓存 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值