Redis 入门

Redis 入门

基本概念

Redis 简介

Redis 是一款由 C 语言开发,开源,高性能的,基于键值对(key-value)的 NOSQL 数据库,NOSQL 是指 Not Only SQL,意即“不仅仅是 SQL”,泛指非关系型的数据库。

Redis 官方提供测试数据,50 个并发执行 100000 个请求,读的速度是 110000次/s,写的速度是81000次/s ,且 Redis 通过提供多种键值数据类型来适应不同场景下的存储需求,Redis 支持的键值数据类型如下

  • 字符串类型 String
  • 哈希类型 Hash
  • 列表类型 List
  • 集合类型 Set
  • 有序集合类型 sortedset

典型的 Redis 应用场景有

  • 内容缓存(数据查询、短连接、新闻内容、商品内容等)
  • 聊天室的在线好友列表
  • 任务队列(秒杀、抢购、12306等等)
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理(可以精确到毫秒)
  • 分布式集群架构中的 Session 分离

Redis作为缓存

下安装 Redis

个人学习和实验环境搭建在 Windows,但是实际使用生产环境都是在 Linux,Windows 版 Redis 点 这里 下载,解压即用,Linux 版本需要下载源码,编译安装,安装过程很简单,官网有介绍,不再赘述。

几个重要的文件

  • redis.conf:Redis 的配置文件
  • redis-cli:Redis 的客户端
  • redis-server:Redis 的服务器端

若要进行 Redis 的实验,首先需要在本机运行 Redis 服务器端 redis-server,Redis 默认端口号为 6379,然后运行 Redis 客户端 redis-cli,客户端会自行连接至本机服务端

命令操作 Redis

Redis 的数据类型

Redis 存储的是键值对(key-Value)格式的数据,其中 Key 都是字符串,Value 有 5 种不同的数据结构

  1. 字符串类型 String
  2. 哈希类型 Hash:即 Map 格式,存储键值对
  • 列表类型 List:即 LinkedList 格式,可以存储重复元素
  • 集合类型 Set:即集合,不可以存储重复元素
  • 有序集合类型 SortedSet:不可以存储重复元素,且元素是有顺序的

String

  1. 存储,关键字 setset key value
    set username zhangsan
    ok
    set password 12345
    ok
    
  2. 获取,关键字 getget key
    get username
    "zhangsan"
    
  3. 删除,关键字 deldel key
    del password
    (integer) 1
    

Hash

  1. 存储,关键字 hsethset key field value
    hset myhash username lisi
    (integer) 1
    hset myhash password 123
    (integer) 1
    
  2. 获取,关键字 hget
    • hget key field 获取指定 key 和 field 对应的值
      hget myhash username
      "lisi"
      
    • hget key 获取指定 key 下所有的 field-value
      hgetall myhash
      1) "username"
      2) "lisi"
      3) "password"
      4) "123"
      
  3. 删除,关键字 hdelhdel key field
    hdel myhash username
    (integer) 1	
    

List

List 允许重复元素

  1. 添加,关键字 lpushrpush
    • lpush key value 将元素加入到 List 左边
    • rpush key value 将元素加入到 List 右边
    lpush myList a
    (integer) 1
    lpush myList b
    (integer) 2
    rpush myList c
    (integer) 3
    
  2. 获取,关键字 lrangelrange key start end,获取给定范围内的值,若 start0end-1,则表示获取 List 中所有值
    lrange myList 0 -1
    1) "b"
    2) "a"
    3) "c"
    
  3. 删除,关键字 lpoprpop
    • lpop key 删除 List 最左边的元素并返回该元素
    • rpop key 删除 List 最右边的元素并返回该元素

Set

Set 不允许重复元素

  1. 添加,关键字 saddsadd key value
    sadd myset a
    (integer) 1
    sadd myset a
    (integer) 0
    sadd myset b
    (integer) 1
    sadd myset c
    (integer) 1
    sadd myset 1
    (integer) 1
    
  2. 获取,关键字 smemberssmembers key 获取 Set 集合中所有元素
    smembers myset
    1) "c"
    2) "b"
    3) "1"
    4) "a"
    
  3. 删除,关键字 sremsrem key value 删除指定 key 的 Set 中的指定 value
    srem myset b
    (integer) 1
    

SortedSet

SortedSet 是一种有序集合类型,一方面与 Set 一样不允许重复元素,另外,它存储的元素是有序的,这通过每个元素所绑定的的 double 类型的分数实现,也就是说 SortedSet 通过分数为集合中存储的元素进行排序。注意,因为 SortedSet 不可以存储重复元素,当添加元素但元素值已存在时,新的元素所绑定的分数会覆盖之前的元素的分数 。

  1. 添加,关键字 zaddzadd key score value 向 SortedSet 中添加元素并绑定一个分数 score
    zadd mysort 60 zhangsan
    (integer) 1
    zadd mysort 50 lisi
    (integer) 1
    zadd mysort 80 wangwu
    (integer) 1
    
  2. 获取,关键字 zrangezrange key start end [withscores] 获取指定 key 的 SortedSet 集合中的所有元素,withscores 是可选参数,该参数表示是否获取的值带有分数
    zrange mysort 0 -1
    1) "lisi"
    2) "zhangsan"
    3) "wangwu"
    
    zrange mysort 0 -1 withscores
    1) "zhangsan"
    2) "60"
    3) "wangwu"
    4) "80"
    5) "lisi"
    6) "50"
    
  3. 删除,关键字 zremzrem key value
zrem mysort lisi
(integer) 1

通用命令

  1. keys *:查询所有的键,且 * 可以配合其他字母进行模糊查询
  2. type key:获取该 key 对应的 value 的类型
    type username
    string
    
    type myhash
    hash
    
    type mylist
    list
    
    type myset
    set
    
    type mysort
    zset
    
  3. del key:删除指定的 key value
    del mysort
    (integer) 1
    

Redis 持久化

Redis 是一个内存型数据库,所有数据存储在内存当中,如果 Redis 服务器重启,或者物理服务器重启,数据就会丢失,所以有必要将 Redis 存储在内存中的数据持久化到硬盘文件中,Redis 有 RDB 和 AOF 两种持久化方式,持久化行为会在 Redis 安装目录下生成持久化备份文件 dump.rdb

RDB 持久化

RDB 是 Redis 默认的持久化方式,是指在一定的间隔时间中,检测 key 的变化情况,然后持久化数据,不需要配置,查看 redis.conf 文件(Windows 下为 redis.windwos.conf),其中有如下内容

save 900 1
save 300 10
save 60  10000

这段内容是指

  • 如果 900 秒内有至少 1 个 key 发生变化就进行持久化
  • 如果 300 秒内有至少 10 个 key 发生变化就进行持久化
  • 如果 60 秒内有至少 10000 个 key 发生变化就进行持久化

所以,RDB 持久化并不能保证每一次操作都会持久化到硬盘中,是在数据安全与性能之间的一个平衡点

注意,修改 redis.conf 配置文件后,若要生效,需要重启 Redis 服务器,并指定配置文件,例如,在我的 Windows 实验环境下,进入到 Redis 的安装目录 C:\Development\redis-2.8.9,然后打开 cmd,执行命令 redis-server.exe redis.windows.conf 即可

AOF 持久化

AOF 是指 Redis 以日志的方式,记录每一条命令的操作,可以做到每一次 Redis 命令操作后都进行持久化,注意 AOF 持久化会极大的影响 Redis 的性能

打开 redis.conf 配置文件,找到如下内容

appendonly no
        
# appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
# appendfsync no	 : 不进行持久化

appendonly no 表示关闭 AOF 持久化,如果要打开 AOF,设置为 yes 即可
appendfsync always 表示每一次操作都进行持久化
appendfsync everysec 表示每隔 1 秒进行一次持久化
appendfsync no 表示不进行持久化

从持久化文件中恢复数据

从持久化文件中恢复数据非常简单,只需要将 dump.rdb 文件拷贝至 Redis 的安装目录下,然后重启 Redis 服务器。

该备份文件不同操作系统是可以通用的,我 Windows 下的 rdb 文件移动到云服务器(CentOS)上依然可以被 redis-server 读取。

参考

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://yzt.cool/archives/redis入门