1. 官网
https://redis.io/
https://redis.cn/
2. 安装
2.1. 下载
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
2.2. 解压
tar -xf redis-5.0.5.tar.gz
2.3. 安装
make
make install PREDIX=/opt/redis
2.4. 修改环境变量
vim /etc/profile
export REDIS_HOME=/opt/redis
export PATH=.$PATH:REDIS_HOME/bin
2.5. 安装服务
cd utils
./install_server.sh 按脚本填写配置,自动生成脚本文件在/etc/redis/6379
- 一个物理机可以有多个redis实例,通过端口区分
- 可执行程序就一份在目录,多个实例需要各自的配置文件,持久化目录等资源
- service redis_6379 start/stop/restart/status
- /etc/init.d/
- 安装后默认启动redis
2.6. 外部服务器访问
修改配置文件
bind 127.0.0.1 192.168.89.14
protected-mode yes > no
重启
3. 特点
- 二进制安全,需要在客户端约定好编码格式
- 单线程 epoll多路复用
4. 数据类型及操作
4.1. string
4.1.1. 命令
- help @string 查询string相关帮助信息
- select db 选择数据库(0-20)
- set k v 设置一个数据
- set k1 v nx nx仅仅可以新建的时候进行插入数据
- set k2 v xx xx仅仅可以更新的时候进行更新数据
- mset k1 v1 k2 v2 可以进行设置多个值
- get k 返回一个v,没有返回nil
- mget k1 k2 k3 获取多个v
- getrange k start end 获取一个索引从start到end,双闭合的区间
- setrange k start value 更新区间范围,我们可以从start的索引开始,更新value数据
- del key 删除一条kv数据
- keys pattern 用正则查询key
- flushdb 清空db
- append k v 给k的数据进行追加v这个数据
- type k 查看value是什么类型
- object encoding k 查看v的数据类型
- incr k1 将integer的数据类型加一
- incrby k1 v 将integer数据类型加v
- decr k1 将integer的数据类型减一
- decrby k1 v 将integer数据类型减v
- incrbyfloat k1 v 将integer数据类型加一个浮点型
- 数据不够长的时候编码是embstr,之后会变为raw格式
- strlen k1 查看v的长度
- redis-cli --raw 进行进入,会识别编码(比如自动识别GBK)
- getset k1 v 更新新值,返回旧值
- bitpos key bit [start] [end] 查看从start到end的字节,第一次bit出现的位置
- bitcount key [start] [end] 查看start到end的时候,1出现的次数
- bitop and andkey k1 k2 执行k1 k2 按位与操作
- bitop or orkey k1 k2 按位或操作
4.1.2. 适用场景
- 数值
- 抢购
- 秒杀
- 详情页
- 点赞
- 规避并发下,对数据库的事务操作,完全由redis内存操作代替
- 二进制位操作
- 用户系统,统计用户登录天数.且窗口随机
- 628活动,总礼物,备货多少
- 僵尸用户
- 冷热用户/忠诚用户
- 活跃用户统计: 随即窗口
4.2. list
4.2.1. 命令
- lpush、lpop、rpush、rpop 和栈一样
- lrange 0 -1 所有元素查看
- lindex key index 查看索引位置的值
- lrem key count value 移除count数量的value
- linsert key after afval value 在键后面插入值
- linsert key before befval value 在key前面插入值
- blpop 阻塞式取值(等待有值再取出)
- ltrim key [start] [end] 修剪,进行修剪队列
4.2.2. 应用
- 队列
- 栈
4.3. hash
4.3.1. 命令
- hset key filed value 设置一个key field的值
- hget key field 获得一个key field的值
- hmset key field value field value 设置多个field的值
- hmget key field fied 获取多个field的值
- hkeys key 查看所有的key
- hvals key 查看所有的field
- hincrby key field num 增加num值
4.4. set
4.4.1. 命令
- sadd key v1 v2 v3… 插入v1,v2,v3…
- smember key 列出所有的value
- srem v1 v2 删除v1,v2…
- sinter k1 k2 求交集并返回
- sinterstore dest k1 k2 交集结果存储dest
- sunion k1 k2 求并集返回
- sunionstore dest k1 k2 并集存储dest
- sdiff k1 k2 求差集并返回
- sdiffstore dest k1 k2 求差集存储dest
- srandmember k1 随机返回一个成员
- srandmember k1 num 随机返回num个元素,num为正数,取出一个去重结果集,如果为负数,那么取出不去重结果集
4.5. zset
4.5.1. 命令
-
zadd k score mem score mem 插入数据后增加权重
-
zrange k 0 -1 取出所有的值
-
zrangebyscore k low high 取出从low到high区间的数据
-
zrange k start end 从start到end之间的数据取出
-
zscore k v 返回一个数据的分值
-
zscore k v 返回一个数据的排行
-
zrange k 0 -1 withscores 携带分数取出
-
zincrby k incrscore v 增加一个值的分值
-
zunionstore k keynum k1 k2…[aggregate max] 多个key的并集[最大值]
5. 管道连接redis(一次发送多个命令,节省往返时间)
echo -e "set s1 1\nincr s1\n get s1" |nc localhost 6379
6. 发布订阅(pub/sub)
subscribe channel 订阅消息
publish channel message 发布消息
7. 事务(transactions)
multi 开启事务
...
exec 执行事务
在事务开启前使用watch,
如果执行EXEC 或者DISCARD, 则不需要手动执行UNWATCH 。
watch 如果数据被更改,那就不执行事务,对事务只生效一次
multi
exec 执行的时候如果期间watch的值被修改 则事务提交不成功
127.0.0.1:6379> watch s1
OK
127.0.0.1:6379> set k6 1
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set s7 1
QUEUED
127.0.0.1:6379> EXEC
(nil)
unwatch 取消监视
discard 放弃事务
8. 布隆过滤器(redisbloom)
8.1. 模块导入
redis模块 https://redis.io/modules
在redis.io/modules选择redisbloom的github,克隆下来
解压,make编译,将redisbloom.so这个链接库复制到/opt/redis
执行
redis-server --loadmodule /opt/redis/redisbloom.so
也可以在/etc/init.d/redis_6379 文件中修改
EXEC=/usr/local/bin/redis-server > EXEC=/usr/local/bin/redis-server --loadmodule /opt/redis/redisbloom.so
Redis Bloom的使用:
BF.ADD k1 V 添加数据值
BF.EXISTS k1 V 判断是否存在
8.2. bloom filter,counting bloom,cukcoo是什么?
-
bloom filter
它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
运用:网页黑名单、垃圾邮件、爬虫网址判重
Java想要使用BloomFilter可以考虑使用google的guava -
counting bloom
这个计数器,使用4位bit来表示一个计数(这个数字可以自己指定长度的),所以我们可以进行计数。
(详细参考:https://wenku.baidu.com/view/9e5832df7f1922791688e84f.html)
- cuckcoo
cuckoo filter的产生源于一个故事,盒子故事(参考:https://www.cnblogs.com/chuxiuhong/p/8215719.html)
我们使用2个表存,可以存放在任意一个,那么数学期望由O(logN/loglogN)变成O(loglogN)。
因此,而设计出来布谷过滤器。
布谷过滤器使用2个哈希表,元素计算哈希,如果没有值,则放入,有值,则踢出元素,重新计算新的哈希,放入,如此反复。参考附件:cuckoo filter
redis的布隆过滤器模块也是用到了cuckoo的哈希,在cuckoo.c文件中