Redis
一、简介
Redis是 Remote Dictionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过 TCP 协议读写 字典中的内容,是一种内存数据库,但它提供了可异步写入硬盘的功能。
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串(String)、哈希表(Hash)、列表(List)、集合(Set)、有序集合(ZSet),位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
每一个 Redis 实际上支持0-15 共16个数据库,Redis 总是自动使用0号数据库,数据库直接数据并非隔离,且其密码相同,只能使用编号不能自定义数据库名,不同应用程序应该使用不同的 Redis 实例而非共用一个 Redis 实例的多个数据库。
二、Windows 上安装 Redis
已编译程序下载地址:https://github.com/dmajkic/redis/downloads**
1、安装Cygwin
2、修改 Redis 源码
a、编辑src目录下的redis.h 文件,头部加入
#ifdef CYGWIN
#ifndef SA ONSTACK
#define SA ONSTACK 0x08000000
#endif
#endif
b、编辑 object.c 文件,头部加入
#define strtold(a,b)((long double)strtod((a),(b)))
c、使用 make 命令编译 Redis
三、Redis 可执行文件
文件名 | 说明 |
---|---|
redis-server | Redis 服务器 |
redis-cli | Redis 命令行客户端 |
redis-benchemark | Redis 性能测试工具 |
redis-check-aof | AOF 文件修复工具 |
redis-check-dump | RDB 文件检查工具 |
四、Redis 命名实践规范
1、“type🆔prop”:该键存储类型为type的对象,其唯一标识为id,属性为prop的指;
2、"types:count:该键的指存储自增编号,因为其总数是总是等于type新增对象的id
五、Redis 命令
Redis 命名 | 说明 |
---|---|
KEYS * | 获取键名列表,支持*,?,[],\x 通配 |
EXISTS key | 判断键是否存在 |
DEL key [key…] | 删除键并返回删除的键数 |
INCR key | 自增 |
INCRBY key increment | 增加指定的整数 |
DECR key | 自减 |
DECR key decrement | 减少指定的整数 |
INCRBYFLOAT key increment | 增加指定浮点数 |
APPEND key value | 向键值末尾追加 value,返回追加后字符串的总长度。 |
STRLEN key | 返回键值的长度,键不存在则返回 0 |
MGET key [key …] | 同时获取多个键值 |
MSET key value [key value …] | 同时设置多个键值 |
GETBIT key offset | |
SETBIT key offset value | 获取一个字符串类型键指定位置的二进制值,offset 从 0 开始 |
BITCOUNT key [start] [end] | |
BITOP operation destkey key [key …] | |
HGET key field | 获取散列值类型key的field字段的指 |
HSET key field value | 设置散列值类型key的field字段的值 |
HGET key field [key field …] | |
HSET key field value [key field value] | |
HGETALL key | 获取散列值类型的所有键值 |
HEXISTS key field | 判断字段是否存在 |
HSETNX key field value | 当字段不存在时才进行赋值 |
HINCRBY key filed increment | 给字段增加值 |
LPUSH key value [value …] | 向列表类型 key 前加入 value |
RPUSH key value [value …] | 向列表类型 key 后加入 value |
LPOP key | 弹出列表左边的元素 |
RPOP key | 弹出列表右边的元素 |
LLEN key | 获取列表长度,该值是一个静态值,无需统计 |
LRANGE key start stop | 获取列表片段 |
LREM key count value | 删除列表中前 count 个值为 value 的元素,返回实际删除的元素个数 |
LINDEX key index | 获取指定索引的元素值 |
LSET key index value | 设置指定索引元素值 |
LTRIM key start end | 只保留列表指定片段,其他删除 |
LINSERT key BEFORE | AFTER pivot value |
RPOPLPUSH source destination | 将元素从一个列表转到另一个列表 |
SADD key member [member …] | 增加元素 |
SREM key member [member …] | 删除元素 |
SMEMBERS key | 获取集合中所有元素 |
SISMEMBER key member | 判断元素是否在集合中 |
SDIFF key [key…] | 求差集 |
SINTER key [key…] | 求交集 |
SUNION key [key…] | 求并集 |
SCARD key | 求集合中元素个数 |
SDIFFSTORE dest_key key[key…] | 求差集并将结果保存到 dest_key |
SINTERSTORE dest_key key [key…] | 求交集并将结果保存到 dest_key |
SUNION dest_key key [key…] | 求并集并将结果保存到 dest_key |
SRANDMEMBER key count | 随机生成弹出一个元素集合,当count为负数时出现重复元素可能性很高,这是由哈希与哈希桶原理导致的 |
SPOP key | 随机弹出一个元素 |
EXPIRE key seconds | 设置一个键的生存时间,成功返回1,否则为0 |
TTL key | 返回键的剩余时间,键不存和永久键(默认)在时返回 -1 |
PERSIST key | 设置键为永久键,SET与GETSET均会清空过期时间 |
PEXPIRE key milseconds | 设置一个键的生存周期,毫秒级 |
PTTL key | 返回键的剩余时间,毫秒级 |
SORT list_key[set_key] [desc limit start end] | 列表、集合排序 |
ZADD key | 向有序集合加入一个元素 |
ZSCORE key | 获取元素的分数 |
ZRANGE key | 获取排名在某个范围内的元素列表 |
ZRANGEBYSCORE key | 获取指定分数范围内的元素 |
ZINCRBY key inc member | 增加某个元素的分数 |
ZCARD key | 获取集合汇总元素的数量 |
ZCOUNT key | 获取指定分数范围内的元素个数 |
ZREM key | 删除一个或多个元素 |
ZREMRANGEBYRANGE key start stop | 按照排名范围删除元素 |
ZREMRANGEBYSCORE key min max | 按照排放分数范围删除元素 |
ZRANK key member | 获取元素排名 |
HKEYS key | 查看 Hash 的键列表 |
HVALS key | 查看 Hash 的值列表 |
HLEN key | 查看 Hash 的长度 |
CONFIG SET | 修改配置 |
CONFIG GET | 获取配置 |
六、Redis 服务
- Redis 服务默认端口为6379
redis-server #最简启动
redis-server /path/to/redis.conf --loglevel warning --port 6380 #设置配置文件,启动端口,修改配置参数
七、Redis 命令行客户端
1、发送命令
redis-cli -h 127.0.0.1 -p 6379 # 连接 Redis 服务器
redis-cli SHUTDOWN #关闭 Redis 服务
redis-cli PING #测试客户端与 Redis 的连接
redis- cli //进入交互模式,方便发送多个命令
redis 127.0.0.1:6379>PING //交互模式中发送PING 命令
PONG //服务器响应,PONG 代表连接成功
redis 127.0.0.1:6379> //等候输入命令
redis 127.0.0.1:6379> auth 123456 //输入Redis 密码123456
2、命令返回值
redis-cli PING //发送 PING 命令
PONG # 状态回复
redis-cli ERRORCOMMAND #不存在 ERRORCOMMAND 命令,故错误回复
(error) ERR unknown command 'ERRORCOMMAND'
redis-cli INCR foo
(integer) 1 # 整数回复
redis-cli GET str
"str" # 字符串回复,空串返回 (nil)
#多行字符串回复,如果没有存储数据返回(empty list or set)
redis-cli KEYS *
1) "str"
2) "foo"
七、Redis 事务
MULTI
...
EXEC
事务出现语法错误时,所有语句不执行,事务出现运行时错误时,
其他语句正常执行,但 Redis 错误要自行维护,Redis 不支持事务回滚。
八、Redis 内存策略(maxmemory-policy)
注:maxmemory-samples 参数要设置
规则 | 说明 |
---|---|
volatile-lru | 使用 LRU 算法删除一个键(设置了Expire) |
allkeys-lru | 使用 LRU 算法删除一个键 |
volatile-random | 随机删除一个键(设置了Expire) |
allkeys-random | 随机删除一个键 |
volatile-ttl | 删除生存时间最近的一个键 |
noeviction | 不删除键,只返回错误 |
九、Redis 持久化
- 根据配置规则进行自动快照
- 用户执行 SAVE 或 BGSAVE
- 执行 FLUSHALL 命令
- 执行复制(replication)
十、集群
#启动主从服务器
redis-server --port 6380 --slaveof 127.0.0.1 6379
#启动客户端
redis-cli -p 6379
redis-cli -p 6380
节点取余和一致性哈希
十一、docker 运行
# 运行服务端
docker run --name redis -d -p 6379:6379 -v /opt/data/redis:/data daocloud.io/library/redis:6.0.5
#运行客户端
docker run -it --link redis:redis --rm redis redis-cli -h redis -p 6379
缓存存在的问题
缓存穿透:
缓存雪崩:指在某个时间点,缓存中的Key集体发生过期失效导致大量的查询数据库的请求都落在数据库上,导致数据库负载过高,压力暴增。
缓存击穿:指缓存中某个频繁被访问的Key过期失效,导致高并发的请求直接请求数据库导致数据库压力一瞬间暴增