Redis(二)redis发布与订阅以及三种新数据类型
1 配置文件
Utis单位部分
redis支持字节但不支持其他类型
Includes部分
设置包含的其他文件的目录
netword网络部分
bind
:默认情况bind=127.0.0.1只接受本机的访问请求,不写的话,无限制接收任何ip的访问。
生产环境下肯定要写应用服务器的地址;服务器需要远程访问的,肯定要将其注释掉。
如果开启了protected-mode(保护模式,默认为yes),那么在没有设定bind ip 的情况下,Redis只允许响应本机的请求。
port
:6379 端口号。
tcp-backlog
:
timeout
:超过时间无操作则需要重新连接redis,默认为0表示永不超时
tcp-keepalive
:设置检测无操作的频率,单位为秒,检测到两次则释放连接
pidfile
:将进程号保存到指定路径的文件中
loglevel
:redis中日志的级别
-
debugger:
-
verbose:有用的信息
-
notice(默认):
-
warning:
logfile
:输出日志的设置路径
database
:redis数据库个数,默认为16
Security 部分
可以在这一部分设置密码
云服务器一定要设置密码,否则遭受攻击内存满载命令都执行不了
Limits部分
limit
:最大连接的客户端数量
maxmemory
:redis能使用的最大内存
当内存达到要求时,按照下面算法移出相应的键值对

maxmemory-samples
:设置抽样样本数量,用于上面的调度算法
2 发布与订阅
Redis发布订阅(sub/pub)是一种消息通信模式,发送者(sub)在任意频道发布消息,频道订阅者(sub)接收消息。
redis可以订阅任意数量的频道

subscribe 订阅消息
127.0.0.1:6379> subscribe channel1 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "channel1" 3) (integer) 1 1) "message" 2) "channel1" 3) "hello"
publish 发布消息
127.0.0.1:6379> publish channel1 hello (integer) 1 127.0.0.1:6379>
3 数据类型
3.1 BitMaps
BitMaps本身不是一种数据类型,实际上它就是一个字符串(key-value),只不过它可以对字符串的位进行操作。
Redis为BitMaps单独提供了一套命令,所以和字符串的操作还是不太相同,可以把bitMaps看做一个以位(bit)为单位的数组,数组的每个单元只存储0和1,数组的下标被称作BitMaps的偏移量。
基本命令
setbit 设置BitMaps中指定偏移量的值(0或者1)
偏移量从0开始
127.0.0.1:6379> setbit users:20221102 1 1 (integer) 0 127.0.0.1:6379> setbit users:20221102 6 1 (integer) 0 127.0.0.1:6379> setbit users:20221102 11 1 (integer) 0 127.0.0.1:6379> setbit users:20221102 15 1 (integer) 0 127.0.0.1:6379> setbit users:20221102 19 1 (integer) 0 127.0.0.1:6379>
如上实例,记录2022年11月2日用户访问的情况,偏移量为1 6 11 15 19的用户访问了网站
很多用户的id以指定的数字开头,直接将其作为BitMaps的偏移量会造成很大的浪费,通常的做法是将这些id减去指定的数字
在第一次初始化bitmaps时,如果偏移量特别大,那么整个初始化过程执行会比较慢,可能会造成redis的阻塞
getbit 获取bitmaps中偏移量为offset的值
127.0.0.1:6379> getbit users:20221102 19 (integer) 1 127.0.0.1:6379> getbit users:20221102 18 (integer) 0
bitcount 获取开始和结束 字节 内位为1的个数
127.0.0.1:6379> setbit users:20221102 1 1 (integer) 0 127.0.0.1:6379> setbit users:20221102 6 1 (integer) 0 127.0.0.1:6379> setbit users:20221102 11 1 (integer) 0 127.0.0.1:6379> setbit users:20221102 15 1 (integer) 0 127.0.0.1:6379> setbit users:20221102 19 1 (integer) 0 127.0.0.1:6379> getbit users:20221102 19 (integer) 1 127.0.0.1:6379> getbit users:20221102 18 (integer) 0 127.0.0.1:6379> bitcount users:20221102 0 -1 (integer) 5 127.0.0.1:6379> bitcount users:20221102 0 1 (integer) 4
比如上面0~-1表示第一个字节到最后一个字节,肯定是全部的为5
0 ~ 1 则表示前两个字节,位数则对应0 ~ 15,结果就是四个了
bitop and(or/not/xor) [key...] 对多个key进行逻辑运算并保存结果到destkey中
3.2 HyperLogLog
简介
使用场景:在工作中经常用到统计的功能需求,如统计网站PV(PageView页面访问量),可以使用redis的incrby、incr轻松实现。
但是像(UniqueVisitor 独立访客)、独立IP数、搜索记录数等需要去重和计数的问题,统称为基数问题,就需要使用下面的解决方案:
-
数据存储在Mysql表中,使用distinct count来计算不重复的个数
-
使用redis提供的hash set bitmaps等数据结构来处理
以上方案结果精确,但是随着数据的不断增加占用的空间会越来越大,对于非常大的数据集是非常不合适的.
RedisHyperLogLog是专门用来做基数统计的算法,优点在于计算基数所需要的空间总是固定的,并且是很少的,每个HyperLoglog键只需要花费12kb内存,就可以存储2^64个不同元素的基数.
HyberLogLog只会存储输入元素的基数,不会存储输入的元素本身,所以不能像集合一样返回输入的各个元素.
基本命令
pdadd ... 向键值为key的HyperLogLog中添加value
pdcount ... 获取多个键值为key的HyperLogLog的基数
127.0.0.1:6379> pfadd program "java" (integer) 1 127.0.0.1:6379> pfadd program "java" (integer) 0 127.0.0.1:6379> pfadd program "C++" (integer) 1 127.0.0.1:6379> pfcount program (integer) 2 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> pfadd char "a" (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> pfcount program char (integer) 3
pfmerge merge
127.0.0.1:6379> pfmerge merge program char OK 127.0.0.1:6379> pfcount merge (integer)
3.3 Geographic
简介
Redis3.2增加了对GEO类型的支持.GEO 全称Geographic,地理信息的缩写,该类型就是元素的二维坐标,也就是经纬度.redis基于该类型,提供了经纬度设置 查询 范围查询 以及 距离测量 经纬度哈希等一系列的操作.
基本命令
geoadd 给键值为key的Geographic添加经纬度信息(经度 纬度 名称)
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai (integer) 1 127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqing 114.05 22.52 shenzhen 116.38 39.90 beijing (integer) 3 127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai (integer) 0
已经添加了的数据是没有办法再添加的
两级无法添加,一般会下载城市数据,然后由java程序一次性导入
geopos ... 获取键为key的Geographic的value的经纬度信息
127.0.0.1:6379> geopos china:city shanghai 1) 1) "121.47000163793563843" 2) "31.22999903975783553" 127.0.0.1:6379> geopos china:city shanghai beijing 1) 1) "121.47000163793563843" 2) "31.22999903975783553" 2) 1) "116.38000041246414185" 2) "39.90000009167092543"
geodist [m|km|ft|mi] 获取两个位置之间的直线距离
127.0.0.1:6379> geodist china:city shanghai beijing "1068153.5181" 127.0.0.1:6379> geodist china:city shanghai beijing km "1068.1535" 127.0.0.1:6379>
单位默认为米
ft:英尺
mi:英米
georadius [m|km|ft|mi] 获取以给定经纬度为中心radius为半径的元素
127.0.0.1:6379> georadius china:city 110 30 1000 km 1) "chongqing" 2) "shenzhen"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步