Redis基础


Redis介绍

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

Redis的数据结构

Redis有五种数据结构

字符串(String)

  • 字符串类型是非常常见的一种类型,Redis中的字符串类型和很多编程语言里的字符串类型差不多,但相对要灵活些。

    字符串列表(list)

  • 列表可以看作是个双端队列,可以在列表两端推入和弹出元素。对列表的不同操作可以实现其他编程语言中的堆栈(同一端进出)和队列(一端进,另一端出)数据结构。

字符串集合(set)

  • set:集合最显著的特点应该就是其中的元素互不相同。用户可以快速对集合进行插入,删除,检查某元素是否在集合中的操作。此外,多个集合间也能很方便的执行交、并、差集运算。

哈希(hash)

  • hash:Redis中的散列可以让用户将多个键值对存储到一个Redis键中,可以把这种数据聚集看作是关系数据库中的行,或者文档数据库中的文档。

有序字符串集合(sorted set)

  • zset:有序集合存储着成员与分值(权值,在Redis中以IEEE 754双精度浮点数的格式存储)之间的映射,并且提供了分值处理命令。适用于按照权值获取元素的情况。如热门帖子获取、基于投票数排序文章等。

Redis常用命令

字符串(String)

  • set key value # 设置key对应的值为string类型的value
  • get key # 获取指定key的value值
  • del key # 删除指定key的值
  • getset key value #先获取key的值,再设置key的值为value
  • incr key #对key的值做自增操作,返回新的值
  • decr key #对key的值做自减操作,返回新的值
  • incrby key integer #对key的value增加指定数值
  • decrby key integer #对key的value减指定数值
  • append key value #给指定key的字符串追加数值

哈希(hash)

String Key和String Value的map容器

  • hset key field value 向散列key中添加一个键值对
  • hget key field 获取散列key中的一个键的值
  • hmset key field1 value1 [field2 value2 …] 向散列key中添加一个或多个键值对
  • hmget key field1 [field2 … ] 获取散列key中的一个或多个键的值
  • hdel key field1 [field2 … ] 删除散列中的一个或多个键值对,返回成功删除的键值对数量
  • hlen key 返回散列包含的键值对数量
  • hincrby key field integer 给散列中指定field的值加上integer
  • hexists key field 测试指定field是否在散列中存在
  • hkeys key 返回散列中所有field
  • hvals key 返回散列中所有value
  • hgetall key 返回散列中所有键值对

字符串列表(list)

类似数据结构中的链表,有以下三种存储方式

  • ArrayList使用数组方式存储
  • LinkedList使用双向链接方式
  • 双向链表中增加数据
  • 双向链表中删除数据

常用list命令

  • lpush key value1 [value2…] 在key对应的list的头部(左端)添加元素
  • rpush key value1 [value2…] 在key对应的list的尾部(右端)添加元素
  • lpop key 移除并返回key对应的list的头部(左端)元素
  • rpop key 移除并返回key对应的list的尾部(右端)元素
  • lindex key offset 返回列表中偏移量为offset的元素
  • lrange key start end (0代表第一个元素,-1代表最后一个元素) 返回列表中从start偏移量到end偏移量中的元素,包含两个端点元素(只返回,原list不变)
  • ltrim key start end 对列表进行修剪,只保留从start偏移量到end偏移量的元素,包含两个端点
  • llen key 返回对应列表的长度

其他命令

  • blpop key1 [key2…] timeout 从第一个非空列表中弹出位于头部(左端)的元素,或者在timeout秒内阻塞并等待可弹出元素的出现
  • brpop key1 [key2…] timeout 从第一个非空列表中弹出位于尾部(右端)的元素,或者在timeout秒内阻塞并等待可弹出元素的出现
  • rpoplpush source-key dest-key 从source-key列表中弹出位于最右端的元素,然后把这个元素插入dest-key列表的最左端,并向用户返回该元素
  • brpoplpush source-key dest-key timeout 从source-key列表中弹出位于最右端的元素,然后把这个元素插入dest-key列表的最左端,并向用户返回该元素。如果source-key为空,则在timeout秒内阻塞并等待可弹出元素的出现

字符串集合(set)

常用命令

  • sadd key value1 [value2…] 将一个或多个元素添加到集合中,并返回添加成功的元素的个数
  • srem key value1 [value2…] 从集合中移除一个或多个元素,返回移除成功的元素的个数
  • sismember key value 检查元素value是否在集合key中,存在返回1,不存在返回0
  • scard key 返回集合包含的元素个数
  • smembers key 返回集合包含的全部元素
  • srandmember key [count] 随机返回集合中的一个或多个元素。当count为正数时,返回的元素不会重复;当count为负数时,返回的元素有可能会重复
  • spop key 随机移除集合中的某个元素,被返回给用户
  • smove source-key des-key value 如果集合source-key中包含元素value,则移除它,并添加到dest-key中;成功移除并添加则返回1,否则返回0

其他命令

  • sdiff key1 [key2…] 返回所有集合的差集
  • sdiffstore dest-key key1 [key2…] 将计算所得的差集中的元素添加到dest-key中
  • sinter key1 [key2…] 返回所有集合的交集
  • sinterstore dest-key key1 [key2…] 将计算所得的交集中的元素添加到dest-key中
  • sunion key1 [key2…] 返回所有集合的并集
  • sunionstore dest-key key1 [key2…] 将计算所得的并集中的元素添加到dest-key中

有序字符串集合(sorted set)

  • zadd key score1 member1 [score2 member2 … ] 将带有给定分值的成员你添加到有序集合中。注意分值在前,成员在后
  • zrem key member1 [member2 … ] 从有序集合中删除指定成员,并返回成功删除的元素个数
  • zcard key 返回有序集合包含的成员个数
  • zincrby key increment member 给指定成员的分值加上increment
  • zcount key min max 返回分值介于min和max之间的成员数量
  • zrank key memeber 返回指定成员在有序集合中的排名,成员按照score从小到大排序
  • zrevrank key memeber 返回指定成员在有序集合中的排名 ,成员按照score从大到小排序
  • zscore key member 返回指定成员的分值
  • zrange key start stop [WITHSCORES] 返回有序集合中排名介于start和stop之间的成员,如果给定了可选的 WITHSCORES选项,则连带成员分值一并返回
  • zrevrange key start stop [WITHSCORES] 同上,结果按score逆序
  • zrangebyscore key min max [WITHSCORES] 返回分值介于min和max之间的成员
  • zremrangebyrank key start stop 删除集合中排名在start和stop之间的成员
  • zremrangebyscore key min max 删除集合中分值在min和max之间的成员

key的相关命令

Key定义注意点

  • 不要过长
  • 不要过短
  • 在项目中应该遵循统一的命名规范

常用命令

  • exists key 测试指定key是否存在
  • del key1 [key2 …] 删除给定key
  • type key 返回给定key的类型
  • keys pattern 以正则表达式的形式,返回匹配的所有key
  • keys *(返回所有key)
  • rename oldkey newkey 修改key的名字
  • dbsize 查看数据库中key的数量(并不是所谓的大小)
  • expire key seconds 为key指定过期时间,到期自动删除
  • ttl key 查看key的剩余时间
  • select index 选择数据库(默认16个数据库,index为0-15)
  • move key index 将key移动到指定数据库
  • flushdb 清空当前数据库key
  • flushall 清空所有数据库key

Redis的事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。

事务的常用命令

  • discard 取消事务,放弃执行事务块内的所有命令。
  • exec 执行所有事务块内的命令。
  • multi 标记一个事务块的开始。
  • umwatch 取消 WATCH 命令对所有 key 的监视。
  • watch key [key …]
    监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

Redis的持久化-数据从内存同步到硬盘

两种持久化方式:

  • RDB方式
  • AOF方式

持久化使用的方式:

  • RDB方式:
    默认支持,在指定的时间间隔内,将内存中的数据集快照写入到磁盘
  • AOF方式:
    日志的形式记录服务器处理的每一个操作,服务器启动之初,读取文件,重新构建数据库
  • 无持久化:
    通过配置继用Redis持久化功能,Redis缓存机制
  • 同时使用RDB和AOF

RDB方式的持久化

优势:

  • 数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难
  • 压缩文件转移到其他介质上
  • 性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作
    ,避免服务器进程执行I/O操作,启动效率高

劣势:

  • 无法高可用:系统一定在定时持久化之前宕机,数据还没写入,数据已经丢失
  • 通过fock分叉子进程完成工作,数据集大的时候,服务器需要停止几百毫秒甚至1秒

默认配置配置:查看redis.conf配置文件

  • save 900 1 #每900秒至少1个key变化,持久化一次,到内存一个快照
  • save 300 10 #每300秒至少10个key变化,往硬盘写一次
  • save 60 10000 #每60秒至少10000个key变化,写一次
  • dbfilename dump.rdb #数据的文件名
  • dir ./ #保存的路径,redis路径下

AOF持久化方式

优点:

  • 同步写入频率高
  • 不破坏写入日志数据
  • 当数据过大,可启动修改重写机制,保证修改数据的更新
  • 日志文件格式清晰,便于重建数据

缺点:

  • 效率低
  • 文件偏大于rdb文件

配置过程:

  • 编辑redis.conf配置文件
  • 找到 appendonly no 修改为 yes

Author: stream
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source stream !
  TOC