Redis基础和相关

250 阅读7分钟

介绍

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型

  • 支持数据持久化
  • 丰富的存储类型
  • 支持数据备份(主从模式)

读的速度约 110000/s 写的速度约 80000/s(后边有性能测试截图,大概差不多)

单个操作原子,多个操作支持事务

运行于内存,可持久化到磁盘

默认端口6379

配置文件:redis.conf

客户端连接

redis-cli -h host -p port -a password

数据类型

string

最大存储512M

  1. set sex man
  2. get sex
  3. getrange sex 0 1
    返回 sex 中字符串值的子字符 ma 从0开始 包括起始
  4. getset sex woman
    将给定 key 的值设为 value ,并返回 key 的旧值(old value)
  5. setex sex 100 man
    将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
  6. setnx sex man
    只有在 key 不存在时设置 key 的值 常用于 分布式锁 🔐
  7. strlen sex
    返回 key 所储存的字符串值的长度
  8. incr num
    将 key 中储存的数字值增一
  9. decr num
    将 key 中储存的数字值减一
  10. mset 11111 aaaaaaa 222222 bbbbbbb
    批量设置k-v
    通常批量设置比循环多次设置效率更高
  11. mget 11111 222222
    批量获取key

hash

hash(哈希) 是一个 string 类型的 field(字段) 和 value(值) 的映射表,适合存储对象

  1. hmset zhangsan height 180 sex man
    hset也是可以新增的
  2. hget zhangsan height
    获取zhangsan这个key的height字段值
  3. hmget huangliwei name sex
    获取key的多个字段值
  4. hdel huangliwei name
    删除一个或多个哈希表字段
  5. hexists huangliwei sex
    查看哈希表 key 中,指定的字段是否存在
  6. hgetall huangliwei
    获取在哈希表中指定 key 的所有字段和值
  7. hkeys huangliwei
    获取所有哈希表中的字段
  8. hvals huangliwei
  9. hlen huangliwei
    获取hash的字段数量

list

简单字符串列表

  1. lpush list 11111
    将一个或多个值插入到列表头部
  2. rpush list 222222 333333
    将一个或多个值插入到列表尾部
  3. llen list
    获取列表的长度
  4. lindex list 0
    通过索引获取列表值
    list从0开始
  5. lrange list 0 10
    获取列表指定范围内的元素
  6. lset list 0 0000001
    通过索引设置列表元素的值
  7. lpop list
    移出并获取列表的第一个元素
  8. rpop list
    移除列表的最后一个元素,返回值为移除的元素
  9. ltrim list 1 3
    对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 起始包括

set

字符串类型的无序集合,不可重复

  1. sadd nameset liyifeng zhangsan
  2. smembers nameset
    返回集合中的所有成员
  3. scard nameset
    获取集合的成员数
  4. spop nameset
    移除并返回集合中的一个随机元素
  5. sdiff nameset1 nameset
    返回第一个集合与其他集合之间的差异
  6. sinter nameset nameset1
    返回给定所有集合的交集
  7. sunion nameset nameset1
    返回所有给定集合的并集

zset

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复

  1. zadd scoreset 100 zhangsan
    向有序集合添加一个或多个成员,或者更新已存在成员的分数
  2. zrange scoreset 0 10 withscores
    通过索引区间返回有序集合指定区间内的成员
  3. zrangebyscore scoreset 20 50
    通过分数返回有序集合指定区间内的成员
  4. zcard scoreset
    获取有序集合的成员数
  5. zscore scoreset yangmi
    获取成员的分数
  6. zrem scoreset lisi
    移除成员

HyperLogLog(了解)

Redis 在 2.8.9 版本添加了 HyperLogLog 结构 Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的

keys 命令

  1. del hello
    删除hello key
  2. exists hello
    检查key是否存在
  3. expire hello 100
    为给定 key 设置过期时间100s,以秒计
    不同业务的key,尽量过期时间分散一点,防止缓存雪崩
  4. ttl hello
    以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)
  5. keys *
    列出所有的key ,* 可换成模板
    生产上强烈不建议使用,会阻塞进程,可使用scan

高级

事务

事务可以一次执行多个命令
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做

redis不需要回滚操作

  1. multi
    标记一个事务块的开始
  2. exec
    执行所有事务块内的命令
  3. discard
    取消事务,放弃执行事务块内的所有命令
  4. watch mankey
    监视一个key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
  5. unwatch
    取消 WATCH 命令对所有 key 的监视

脚本

Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL

Eval 命令的基本语法:

EVAL script numkeys key [key ...] arg [arg ...]
  1. EVAL script numkeys key [key ...] arg [arg ...] 执行脚本,numkeys:key的数量
  2. EVALSHA sha1 numkeys key [key ...] arg [arg ...]
  3. SCRIPT EXISTS script [script ...] 查看指定的脚本是否已经被保存在缓存当中
  4. SCRIPT FLUSH 从脚本缓存中移除所有脚本
  5. SCRIPT KILL 杀死当前正在运行的 Lua 脚本
  6. SCRIPT LOAD script 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本

连接命令

  1. AUTH password
    验证密码是否正确
  2. ECHO message
    打印字符串
  3. ping
    查看服务是否运行
  4. select index
    切换数据库 0-15

服务器命令

  1. save
    同步保存数据到硬盘
  2. bgsave
    在后台异步保存当前数据库的数据到磁盘
  3. info
    获取 Redis 服务器的各种信息和统计数值
  4. flushall
    删除所有数据库的所有key
  5. flushdb
    删除当前数据库的所有key

数据库备份与恢复

备份

save
bgsave
该命令将在 redis 安装目录中创建dump.rdb文件

恢复数据

只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可

CONFIG GET dir
获取安装目录

安全

config get requirepass
获取设置的密码

config set requirepass admin
设置密码

auth admin
验证密码

性能

redis-benchmark -n 10000 -p
同时执行 10000 个请求来检测性能

pic1.png

分区

  • 涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作
  • 涉及多个key的redis事务不能使用

分区类型:

  1. 范围分区 最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的Redis实例;不足就是要有一个区间范围到实例的映射表。这个表要被管理
  2. hash分区 用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数 对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中

参考文献

  1. Redis 教程 | 菜鸟教程