redis是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储,Redis支持数据的备份,即master-slave模式的数据备份。
redis常用来做什么
缓存:
使用redis做为缓存热数据,内存中的数据也提供了AOF和RDB等持久化机制可以选择,可以冷存储也可以热存储。在spring中使用Aop构建redis缓存的自动生产和清除,例如: Select 数据库前查询redis,有的话使用redis数据,放弃select 数据库,没有的话,select 数据库,然后将数据插入redis,然后再update或者delete数据库中的数据
计数器
统计点击数等应用。由于单线程,可以避免并发问题,保证不会出错。
队列
相当于消息系统,ActiveMQ,RocketMQ等工具类似,由于redis把数据添加到队列是返回添加元素在队列的第几位,所以可以做判断用户是第几个访问这种业务
位操作
redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,上面我说的几个场景也就能够实现。用到的命令是:setbit、getbit、bitcount
分布式锁与单线程机制
验证前端的重复请求(可以自由扩展类似情况),可以通过redis进行过滤:每次请求将request Ip、参数、接口等hash作为key存储redis(幂等性请求),设置多长时间有效期,然后下次请求过来的时候先在redis中检索有没有这个key,进而验证是不是一定时间内过来的重复提交
秒杀系统,基于redis是单线程特征,防止出现数据库“爆破”
排行榜
谁得分高谁排名往上。使用有续集,sorted set
redis使用
- 登录
启动 redis 客户端
redis-cli
在远程服务上执行命令
redis-cli -h host -p port -a password
使用PING测试服务是否启动
- keys相关命令
查询redis中现存的所有key name
keys *
//序列化给定 key ,并返回被序列化的值。
DUMP key
//检查给定 key 是否存在
exists keyname
//设置key的过期时间
expire keyname seconds
//返回key的类型
type key
- redis String 相关
添加key-value对,获得值
set key value
get key
返回substring
getrange key start end
更改key的value
getset key value
获得多个key的值
mget key1 key2 key3
将key对应的值+1或-1,在字符串后拼接字符串
incr key /decr key
append key svalue
- redis hash 相关
Redis 中每个 hash 可以存储40多亿,value为hash
添加/删除/存在
hdel/hset/hexists key value
添加多个k-v对,全部获取
hmset key hashkey1 value hashkey2 value
hgetall key
获取表中的所有key或所有value,字段数量
hkeys key
hvals key
hlen key
- redis list 相关
是一个按照插入顺序排序的有序列表
入队与获取队中元素
lpush key value
lpush key value2
lrange key 0 10
通过数据在队中的位置获取数据
lindex key 1
获取列表的长度
llen key
弹出
//将头弹出并获取
lpop key
//将尾弹出并获取
rpop key
blpop/brpop key timeout
//分别为若无元素,则等待timeout时间,阻塞
- redis set 相关
Set 是 String 类型的无序集合。集合成员是唯一的
添加k-v对/获取成员变量
sadd key redis
sadd key mongodb
smembers key
scard key //获取成员数
集合之间的交叉并
sdiff 差集
sinter 交集
sunion 并集
删除集合中元素,判断是否在集合中
spop 移除并返回
sismember key member 判断一个元素是否在集合中
- sorted set 相关
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
添加元素,同时zadd可以更新已存在元素的得分
zadd country 1 china
zadd country 2 American
zadd country 3 japen
zrange country 0 10 withscores
获取成员数
zcard key 获取成员数
zrank key member 获取指定成员的索引
zscore key member 获取成员的分数值
- HyperLogLog
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
统计去重元素个数
添加元素,统计数字
pfadd name zhang
pfadd name redis
pfadd name mongodb
pfcount name
redis 发布与订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
订阅
subscribe redisChat
// 一次多个订阅
psubscribe
发布
publish redisChat "message"
- 事务
使用Multi可以开始一个事务,使用Exec用来执行事务
discard用来取消所有事务
网友评论