这个系列大概二十个章节,目前已经学完了,分章节更
keys * 查看当前库所有key(匹配:key *1)
exist key 判断某个key是否存在
type key查看key的类型
del key 删除指定的key’数据
unlink key 根据value选择非阻塞删除(仅将keyspace元数据中删除,真正的删除会在后序异步操作)
expire key 10 给key设置过期时间单位秒
ttl key 查看还有多久过期,-1表示永不过期 -2表示已过期
select 命令切换数据库
dbsize 查看当前数据库的key的数量
flushdb 清空当前库
flushall 通杀全部库
字符串String
string类型是二进制安全的。意味着redis的string可以包含任何数据。如jpg图片挥着序列化的对象。
一个redis中字符串value最多可以使512M
常用命令:
set key value:添加键值对
get key:查询对应键值
append key value :将给定的value追加到原值的末尾
strlen key 获得值的长度
setnx key value:只有在key不存在时,设置key的值
incr key:
decr key:
incrby/decrby key步长:将key中存储的数字值增减,自定义步长
incr和decr是原子性操作(不会被线程调度机制打断的操作)
数据结构:
string的数据结构是简单的动态字符串,是可以修改的字符串,内部结构类似于java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
列表List
单键多值
事件单的字符串列表,按照插入顺序排序
底层是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差
常用命令:(左放就是逆序,右放就是正序)
lpush/rpush key value1 value2… :从左边/右边插入一个或者多个值
lpop/rpop key:从左边/右边吐出一个值,值在键在,值光键亡
rpoplpush key1 key2:从列表右侧吐出一个值,插入到key2列表的左边
lrange key start stop:按照索引下标获得元素(从左到右)lrange name 0 -1
lindex key index :按照索引下表获得元素(从左到右)
llen key :获得列表长度
linsert key before value newvalue :在value的后边插入newvalue
lrem key n value:从左边删除n个value(从左到右)
lset key index value :将列表下标为index的值替换为value
数据结构:list的数据结构是快速链表quicklist。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
她将所有的元素一起挨着存储,分配的是一块连续的内存
当数据量比较多时,才会改成quicklist
因为普通的链表需要的附加指针空间太大,会比较浪费空间。
集合set
redis的set对外提供的功能与list类似,也是一个列表的功能,特殊之处是在于set是可以去重的
是string的无序集合,底层是一个value的null的hash表,所以可以添加、删除、查找都是O(1)
常用命令:
数据结构:色同时dict字典,是用哈希表实现的,使用hash结果,所有的value指向同一个内部值
哈希hash
redis的hash是一个键值对集合,是一个string类型的filed和value的映射表,hash特别适合用于存储对象。
常用命令:
数据结构:两种:当field-value长度较短且个数较少时,shiyongziplist,否则使用hashtable
有序集合Zset
redis的Zset和普通的set很像,是一个没有重复元素的字符串集合
但有序集合的每个成员都关联了一个评分,这个评分被用来按照从低到高的方式排序集合中的成员。集合的成员是唯一的,但是评分是可以重复的
你可以根据评分或次序来获取一个范围的元素
常用命令:
zadd key score1 value score2 value…:将一个或者多个member元素及其评分加入到有序集合key中
zrange key startstop [withscores]:返回key中,下表载start-stop之间的元素;带withscores可以带评分一起返回
zrangebyscore key minmax [withscores] [limitoffset count]:返回key中所有score介于min和max之间的成员,按score值递增排序
zrevrangebyscore key maxmin [withscores] [limitoffset count]:返回key中所有score介于min和max之间的成员,递减排序
zincrby key increment value:为元素的score加上增量
zem key value:删除该集合下,指定值的元素
zcount key min max 统计该集合,分数区间内的元素个数
zrank key value 返回该值在集合中的排名,从0开】开始
可以利用Zset实现一个文章访问量的排行榜
数据结构:使用了两个数据结构:
有序集合在生活中比较常见,例如会根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现么可以用数组、平衡树、链表等。数组不便于数据的插入、删除;平衡树或红黑树虽然效率高但是结构复杂;链表的查询需要遍历效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑偶数,但实现远比红黑树简单。
例如从链表中查询出51利用跳跃表,查找过程如下:
redis端口6379被恶意攻击,导致xshell登录ssh验证失败或者持续等待问题一定要设置redis密码增强防护
另外,加强攻防措施还可以如下:
1、重置密码(最好没有规则)
附随机密码生成器:https://suijimimashengcheng.bmcx.com/
2、使用密钥+密码模式登录
3、设置redis密码
一、编辑redis.conf文件
建议在修改前备份一下redis.conf文件,这样即使操作出错了,也可以从头再来
执行完以上操作后进入指令模式 wq 保存退出
二、重启redis
!!!如果是在卡住进不去,可以在服务器控制台设置快照和镜像然后重装服务器系统(注意要提前备份好数据)
设置密码后要在代码里加上jedis.auth(“密码”)
redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息
redis客户端可以订阅任意数量的频道
命令行实现:
1、打开一个客户端订阅channel1
SUBSCRIBE channel1
(打开的第一个客户端可以看到发布的消息)
2、打开另一个客户端,给channel1发布消息hello
publish channel1 hello
返回的是订阅者的数量
注:发布的消息没有持久化,如果在订阅的客户端收不到hello,只能收到订阅后发布的消息
1)Bitmaps
redis的Bitmaps就可以实现对位的操作:
命令使用:
setbit key voffset alue:设置Bitmaps中某个偏移量的值(0或者1)//偏移量从0开始
注:很多应用的用户id以一个指定的数字(如1000)开头,直接将用户id和Bitmaps的偏移量对应势必会造成浪费,通常每次做setbit操作时将用户id减去这个指定数字
在第一次初始化BItmaps时,加入偏移量非常大,那么整个过程执行会比较慢,可能造成redis的阻塞。
getbit key offset:获取Bitmaps中某个偏移量的值
bitcount key [start end]:统计字符串中从start字节到end字节被设置为1的bit数量
bitop and(or/not/xor) destkey [key…]:复合操作,做多个Bitmaps的and(交集)、or(并集)、xor(异或集),并将结果保存到destkey中
Bitmaps与set对比:
2) HyperLogLog
一些统计问题,比如统计网站PV(pageView页面访问量),可以使用redis的incr、incrby轻松实现。
但是像UV(uniqueVisitor,独立访客)、独立Ip数、搜索记录数等需要去重和技术问题怎么解决?这种求集合中的不重复元素的个数的问题成为基数问题。
解决方法:
以上方法结构精确,但是随着数据量的不断增大,导致占用空间越来越大
降低一定的精度来平衡存储空间—>HyperLogLog:在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的(12KB,可以计算接近2^64个不同元素的基数)
命令使用:
pfadd key element [element]:添加指定元素到HyperLogLog中
pfcount key [key…]:计算HLL的近似基数,可以计算多个key
pfmerge destkey sourcekey [sourcekey…]:将一个或者多个HLL合并后的结果存储在另一个HLL中
3) Geospatial
该类型,就是元素的二维坐标,在地图上就是经纬度,redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度hash等操作
命令使用:
geoadd key longitude latitude member [longitude latitude member…]:添加地理位置(经度纬度名称)
geopos key member [member…]:获取指定地区的坐标值
geodist key member1 member2 [m|km|ft|mi]:获取两个位置之间的直线距离
georadius key longitude latitude radius m|km|mi|ft :以给定的经纬度为中心,找出某一半径之内的元素