Redis Study Note

初识Redis

  • 开源
  • 基于key-value的存储服务系统
  • 多种数据结构
  • 高性能、功能丰富

拥有五种数据结构:

r0

Redis的典型特性:

  • 速度快: 10w OPS
  • 持久化
  • 多种数据结构
  • 支持多种语言
  • 使用简单,单线程
  • 主从复制

额外的数据结构:

  • Bitmaps:位图
  • Htperloglog:超小内存唯一值计数
  • GEO:地理信息位置

支持额外功能:

  • Lua脚本
  • 发布订阅
  • 事务
  • pipeline

典型场景:

  • 缓存

r1

  • 计数器
  • 消息队列
  • 排行榜
  • 社交网络
  • 实时系统

常用配置

daemonize,是否守护进程启动

port,端口,默认6379

logfile,redis日志

dir,工作目录

常用特性

通用命令

  • keys 计算所有的键

docker exec -it redis redis-cli

r2

批量插入mset key1 value1 k2 v2 k3 v3

r3

通配符查找

r4

r5

keys命令为o(n)命令,所以生产中尽量不使用,开销大

  • dbsize 数据库大小

r6

r7

sadd 增加集合,只有一个key

内置计数器,不会遍历表,开销很小o(1)

  • exists key判断键是否存在

r8

o(1)复杂,开销小

  • del keys 删除key

r9

  • expire key seconds 设置key过期时间

过期指令:expire、ttl、persist

expire,设置过期时间

ttl,查询过期时间

persist,去掉过期时间

r10

  • type key 查看key数据类型

r11

type类型:string、hash、list、set、zset、none

各个命令时间复杂度

r12

数据结构

r13

一些压缩编码可以节省空间

RedisObject

r14

单线程

单线程高速的原因:

  • 纯内存IO
  • 非阻塞IO(NIO)
  • 避免了线程切换和竞态消耗

r15

带来的问题:【拒绝慢命令】

keys, flushall, flushdb, slow lua script, mutil/exec, operate big value(collection)

部分操作会fork其他线程:

fysnc file descriptor

close file descriptor

String

所有key都是string,string value 至大512mb,可以存储json,xml等,整数和位图也由字符串实现

incr

incr key,自增操作+1,如果不存在,get回1、o(1)

decr key,自减,若不存在get回-1、o(1)

incrby key k,自增k,若不存在get回k、o(1)

decrby key k,自减k,若不存在get回-k、o(1)

r16

因为redis是单线程,所以不存在并发问题

情景

  • 网站访问统计

    incr userid:pageview

  • 缓存mysql(eg.video)

r1

r17

  • 实现分布式ID生成器

    incr id,利用redis单线程

r18

set

set key value、无论是否存在,都设置、o(1)

setnx key value、如果不存在,则设置、o(1)

set key value xx,如果存在才设置、o(1)

r19

适合实现分布式锁

mset

批量设置、获取,原子操作

mset key1 value1 key2 value2 key3 value3 key4 value4, o(n)

mget key1 key2 key3 key4, o(n)

比起n次get操作,减少网络延迟等问题

r20

r21

others

getset key newvalue ,设置新值并返回旧值,o(1)

append key value,将value追加到旧的value,o(1)

strlen key,返回字符串value长度(不兼容中文),o(1)

r22

incrbyfloat key 3.5,增加浮点数,o(1)

getrange key start end,获取指定下标字符,o(1)

setrange key index value,设置指定下标的值,o(1)

r23

r24

Hash

r25

r26

hget、hset、hdel

hget key field, o(1)

hset key field value, o(1)

hdel key field, o(1)

r27

hexists, o(1),判断属性是否存在

hlen, o(1), 返回属性数量

hmget、hmset

r28

统计流量:

hincrby user:1:info pageview count

缓存视频信息:

r29

r30

谨慎使用o(n)

hash与string对比

r31

对象的实现方法

使用json string格式保存,但是修改需要重新序列化

r32

使用多个string储存,但是结构分离

r33

使用hash保存,随时修改

r34

r35

其他指令

r36

指令复杂度对比

r37

List

数据结构:有序、可以重复

r38

r39

r40

lpush相反

r41

r42

lpop相反

r43

r44

r45

r46

r47

r48

可以用list实现timeline列表,eg.好友动态

其他指令

r49

r50

Set

无序,不重复

r51

r52

r53

pop后set不再有该元素,rand后元素依旧在集合之中

smembers可能会造成阻塞,谨慎使用

可以实现抽奖、点赞等情景、标签等

r54

Zset

有序集合、不可重复

r55

r56

r57

r58

r59

传负数表示减少

r60

r61

n,zset中元素的个数,m,排名段内元素的个数(按照排名)

r62

n,zset中元素的个数,m,分数段内元素的个数(按照分数)

r63

r64

r65

使用情景:排行榜

r66

客户端使用

Java

Jedis是redis-cli(shell)的java版本

r67

r68

r69

Jedis直连,基于tcp连接

r70

Jedis连接池,节省了部分new开销

r71

r72

r73

Golang

r74

redigo的使用:
r75

r76

其他功能

慢查询

生命周期:

r77

如果慢查询,会进入一个先入先出的固定长度队列

r78

r79

配置方法

r80

常用指令

r81

Pipeline

重复命令的网络开销

r82

pipeline实现一次网络开销

jadis的实现举例

r83

r84

与m操作的区别?

m操作的原子的,pipeline不是原子的

应当注意每次pipeline的数据量,可以合理拆分

pipeline只能作用在一个redis节点

发布订阅

r85

publish channel message
subscribe [channel]   // one or more
unsubscribe [channel]   // one or more
psubscribe [channel pattern]
punsubscribe [channel pattern]
pubsub channels // list the channel at least one subscriber
pubsub numsub [channel] //list the subscriber number

实现消息队列

r86

消息只会传达一个消费者

Bitmap

直接操作位

r87

getbit、setbit key offset

bitcount key [start end] 获取全部位为1的个数

r88

BITPOS key bit [start] [end]

返回字符串里面第一个被设置为1或者0的bit位。

返回一个位置,把字符串当做一个从左到右的字节数组,第一个符合条件的在位置0,其次在位置8,等等。

位图可以有效节省空间

Hyperloglog

极小空间完成独立数量统计,本质为string

r89

r90

可以极大的减少空间开支,但是有错误率0.81%

GEO

Redis3.2增加

存储经纬度,计算两地距离等

geo key longitude latitude membername

geopos key member [member…] //get info

geodist key member1 member2 [unit] //calculate the distance

Redis持久化

将内存的临时数据保存在硬盘中(异步)

快照:mysql dump, redis rdb

日志:mysql binlog,redis aof

RDB

r91

触发机制:

  • save(同步)

r92

但是可能造成阻塞

文件策略

如果存在老的快照,则会创建新的快照以替换

复杂度为o(n)

  • bgsave(异步)

r93

r94

  • 自动

常用配置,任意一条满足都会执行

r95

不可忽略的触发机制:

  • 全量复制(主从复制)
  • debug reload
  • shutdown

AOF

RDB耗时,耗性能(内存dump)

RDB不可控,可能因为宕机丢失

AOF基本可以实现实时恢复

三种策略:

  • always

r96

  • everysec(default)

r97

  • no

r98

r99

AOF文件会很巨大,所以需要重写策略,从而减少磁盘占用,并且增加恢复速度

r100

可以使用bgrewriteaof命令显式要求重写

r101

可以在配置文件中设置aof文件尺寸和增长率,同时满足时触发重写

r102

  • Copyrights © 2019-2020 Rex