文章目录
1.Redis概述
Redis:高性能的键值对(key-value)数据库。
Key定义的注意点:
- 不要过长
- 不要过短
- 统一的命名规范
2.应用场景
- 缓存
- 任务队列
- 网站访问统计
- 数据过期处理(精确到毫秒)
- 分布式集群架构中的session分离
3.支持的数据类型
- 字符串(String)(常用)
- 哈希(hash)(常用)
- 字符串列表(list)
- 字符串集合(set)
- 有序字符串集合(sorted set)
存储String
1.概述
- 二进制安全的,存入和获取的数据相同
- Value最多可以容纳的数据长度是512M
2.常用命令
- 赋值(set key value)
- 取值(get key)
- 取旧值并设置新值(getset key value)
- 删除(del key)
- 数值增减
- incr num 若num未赋初值,则将num初始化为0,并加1,当num为非整型时,抛出异常
- decr num 若num未赋初值,则将num初始化为0,并减1,当num为非整型时,抛出异常
- 扩展命令
- incrby num 5 将num对应的value值在原来的基础上加5
- decrby num 5 将num对应的value值在原来的基础上减5
- append num 5 若存在当前的key(num),则在原来的value后追加5这个字符;若不存在当前的key,则创建一个新的key-value
存储Hash
1.概述
- String Key 和 String Value 的 map 容器
- 每一个Hash可以存储4294967295个键值对
2.常用命令
- 赋值
- hset key key1-value1 向集合key中添加key1-value1键值对
- hmset key key1-value1 key2-value2 向集合中添加多个key-value值
- 取值
- hget key key1 获取集合key中对应的键为key1的value1值
- hmget key key1 key2 获取集合key中对应的多组键的value值
- hgetall key 获取集合key中所有的属性(键key和值value)
- 删除
- hdel key key1 key2 删除集合key中多组属性(key-value值)
- del key 删除整个集合key
- 增加数字
- hincrby key key1 5 将集合key中键为key1的value值增加5
- 自学命令
- hexists key key1 判断集合key中是否存在属性key1,存在返回 1,否则返回 0
- hlen key 返回集合key中的属性的个数
- hkeys key 返回集合key中所有属性的键key
- hvalues key 返回集合key中所有属性的值value
存储list
1.存储方式
- ArrayList使用数组方式
- LinkedList使用双向链表方式
- 双向链表中增加数据
- 双向链表中删除数据
2.常用命令
- 两端添加(若链表不存在,则先创建,后添加元素)
- lpush mylist a b c 从左边向链表中添加元素
- rpush mylist a b c 从右边向链表添加元素
- 查看列表
- lrange mylist 0 5 查看链表中从0-5号的位置所对应的元素
- 位置标号也可以为负数,若为负数则表示到链表的末尾第几个元素,例如(lrange mylist 0 -1 表示查询从0到链表末尾第一个元素)
- 两端弹出(弹出后链表中不再包含该元素)
- lpop mylist 从链表左端弹出末尾元素
- rpop mylist 从链表右端弹出末尾元素
- 获取列表元素个数
- llen mylist
- 扩展命令
- lpushx/rpushx mylist x 若链表存在,则向指定的链表的头部/尾部插入数据x;若链表不存在,则不进行操作
- lrem mylist count value 删除链表mylist中count个值为value的数据。若count > 0 则从头到尾遍历链表;若count < 0 则从尾到头遍历链表;若count = 0 则删除链表中所有值为value的数据
- lset mylist index value 向指定的链表mylist中的index位置插入值value
- linsert mylist before/after value1 value2 向指定的链表mylist中的第一个值为value1的元素前面/后面插入数据value2
- rpoplpush mylist1 mylist2 将链表mylist1的尾元素弹出,添加到链表mylist2的头部
rpoplpush的使用场景:
存储Set
1.概述
- 和List类型不同的是,Set集合中不允许出现重复的元素
- Set可包含的最大元素数量是4294967295
2.常用命令
- 添加/删除元素
- sadd myset a b c 向集合myset中添加三个元素a b c
- srem myset a b 删除集合myset中的元素a b
- 获得集合中的元素
- smembers myset 获取集合myset中的元素
- sismember myset a 判断集合myset中是否包含元素a,若存在则返回 1;否则返回 0
- 集合中的差集运算(与key的顺序有关)
- sdiff mys1 mys2 这个我们假设有操作 sadd mys1 a b c,sadd mys2 a c 1 2,则执行差集运算后输出 b
- 集合中的交集运算
- sinter mys1 mys2 (同上),则输出结果为 c a
- 集合中的并集运算
- sunion mys1 mys2(同上),则输出 c 2 b a 1
- 扩展命令
- scard myset 返回集合中数据的个数
- srandmember 随机返回集合中的一个元素
- sdiffstore myset mys1 mys2 将集合mys1和mys2的差集存储到集合myset中
- sinterstorre myset mys1 mys2 与上面一条指令类似,不同的是这里是交集
- sunionstore myset mys1 mys2 并集
3.使用场景
- 跟踪一些唯一性数据
- 用于维护数据对象之间的关联关系
存储Sorted-Set
1.概述
- Sorted-Set和Set的区别
- Sorted-Set中的成员在集合中的位置是有序的
2.常用命令
- 添加元素
- zadd mysort 70 zs 80 ls 90 ww 这里数字对应为所添加的元素的分数,字母为索要添加的元素。若集合中已经存在该元素,则判断元素的分数是否与几何中的相同,若不同,则覆盖原来的值
- 获得元素
- zscore mysort zs 获取集合中某个具体元素的分数
- zcard mysort 获得集合中的元素个数
- 删除元素
- zrem mysort zs ww 删除集合中的某个具体元素
- 范围查询
- zrange mysort 0 -1 (withscores)查询从集合头到尾的所有元素(带分数显示),默认升序排列
- zrevrange mysort 0 -1(withscores)按降序排列查询结果
- zremrangebyrank mysort 0 4 按排名范围删除元素
- zremrangebyscore mysort 80 100 按分数范围删除元素
- 扩展命令
- zrangebyscore mysort 0 100 (withscores)按照分数范围查询元素
- zrangebyscore mysort 0 100 (withscores)limit 0 2 按照分数范围查询元素,并返回前两条记录
- zincrby mysort 3 ls 给指定的元素 ls 的分数加 3
- zcount mysort 80 90 返回分数80到90之间的元素的个数
3.使用场景
- 如大型在线游戏积分排行榜
- 构建索引数据
4.Redis的通用命令
Keys通用操作
- keys * 查看 Redis 中的所有的 key
- keys my?查询 Redis 中所有以 my 开头的 key
- del my1 my2 my3 删除 Redis 中具体的 key
- exists my1 判断 Redis 中是否存在某个key,若存在,返回 1,否则返回 0
- rename name newname 将 Redis 中的某个 key 进行重命名
- expire newname 1000 设置过期时间为 1000s
- ttl newname 查询每个 key 的剩余存活时间,若未设置过期时间,则返回 -1
- type newname 获取某个具体的 key 的类型
5.Redis特性
1.多数据库
- 一个 redis 实例最多可以提供16个数据库,下标分别从0-15,客户端默认连接的是第 0 号数据库,也可以通过 select 命令选择连接哪个数据库
select 1 客户端选择连接 1 号数据库
在 1 号库中执行操作 move myset 0,则会将 1 号库中的 key (myset)移动到 0 号库
2.Redis事务
- multi(开启事务)
- exec(提交事务)
- discard(回滚事务)
6.Redis持久化
一、介绍
-
两种持久化方式
- RDB方式
- AOF方式
-
持久化使用的方式
- 单独使用RDB持久化(默认支持,不需要配置):在指定的时间间隔内,将内存中的数据集快照写入到磁盘
- 单独使用AOF持久化:以日志的形式记录服务器所处理的每一个操作,在 Redis 服务器启动之初,它会读取该文件,然后去重新构建数据库,以此保证数据库数据的完整性
- 无持久化:通过配置禁用 Redis 的持久化功能,从而将 Redis 看作为一个缓存机制
- 同时使用RDB和AOF
二、RDB
- 优势
- Redis 数据库只包含一个文件,利于文件备份
- 易于灾难性恢复(比如拷贝到其它地方,需要恢复时直接利用备份进行恢复)
- 性能最大化
- 启动效率高
- 劣势
- 可能会丢失数据
- 当数据集过大时,整个服务器可能会需要停止几百毫秒,甚至是一秒钟
- 配置(默认)
- save 900 1 表示每900秒至少有一个key发生变化,此时会触发一次持久化操作
- save 300 10 表示每300秒至少有十个key发生变化,此时会触发一次持久化操作
- save 60 10000 表示每60秒至少有一万个key发生变化,此时会触发一次持久化操作
三、AOF
- 优势
- 带来更高的数据安全性;
- 对日志文件的写入操作是append追加模式,若出现宕机情况,也不会破坏日志文件中已经存在的内容;
- 若日志过大,Redis 可以自动启动重写机制
- 包含一个格式清晰易于理解的日志文件,来记录所有的修改操作
- 劣势
- 对于相同数量的数据集,文件相对于RDB方式要大一些
- 根据同步策略的不同,效率相对于RDB要低一些
- 配置
默认情况下是关闭的,即默认使用RDB方式
三种同步策略方式:
- always 每修改一次,执行一次同步操作进行持久化
- everysec 每秒中执行一次同步进行持久化
- no 不同步