官网
官网:http://www.redis.cn/
概念
开源的高性能键值对数据库
16个数据库
端口号 6379
(端口号的范围是从0到65535
1023以下的端口已经分配给了常用的一些应用程序)
进入客户端
redis-cli
密码
查看密码:CONFIG get requirepass
设置密码:CONFIG set requirepass "123456"
输入密码:AUTH "123456"
数据类型
基本数据类型:string,hash,list,set,zset
特殊数据类型:Geo,Bitmap,Hyperloglog
字符串:string
是简单的 Key-Value 类型
一个字符串类型的值能存储最大容量是多少? 512M
场景:分布式锁,分布式session,秒杀,计数
set key val
get key
mget key key key
del key
incr key:自增
decr key:自减
incrby key 3:自增3
decrby key 3:自减3
keys *:查看所有key
哈希:hash
是 string 类型的 key 和 val 的映射表,哈希散列表
场景:存储对象数据(用户信息)
hset 哈希名 键名 值
hget 哈希名 键名
hmset 哈希名 键名 值 键名 值
hmget 哈希名 键名 键名
hgetall 哈希名:得到此哈希里所有的键名和值
hkeys 哈希名:得到此哈希里所有的键名
hvals 哈希名:得到此哈希里所有的值
hdel 哈希名 键名
hexists 哈希名 键名:键是否存在,返回1或0
hincryby 哈希名 键名 3:自增3
列表:list
存储多个有序的字符串
场景:渲染文章列表,一般情况下每个用户都会有自己发布的文章列表,如果需要展示文章列表,就可以使用List数据类型,不但可以有序而且可以按照索引范围去查询文章列表。
rpush 列表名 值 值:将 一个 或 多个 值 推入 列表 的 右端
lpush 列表名 值 值:将 一个 或 多个 值 推入 列表 的 左端
rpop 列表名:移 除 并 返回 列表 最 右端 的 元素
lpop 列表名:移 除 并 返回 列表 最 左端 的 元素
lindex 列表名 下标:返回列表指定下标的值(下标从0开始)
lrange 列表名 开始下标 结束下标:返回列表指定下标范围的值
ltrim 列表名 开始下标 结束下标:只保留下标范围的值
blpop 列表名 列表名 秒数:在指定时间移 除 并 返回 第一个非空列表 最 左端 的 元素
rpoplpush 列表名 列表名:从第一个列表中弹出位于最右端的元素,将这个元素 推入第二个列表的最左端
brpoplpush 列表名 列表名 秒数:rpoplpush的阻塞版本,在指定秒数后才会结束
无序集合:set
不允许出现重复的元素,并且是无序的
场景:记录唯一值:比如登录ip,身份证号。添加标签:通过标签的交并集计算用户喜好程度等数据,共同好友。
sadd 集合名 值 值
srem 集合名 值 值:删除一个或多个值
sismember 集合名 值:检查值是否存在集合中
scard 集合名:返回集合中存在值的个数
smembers 集合名:返回集合中所有的值
srandmember 集合名 3:从集合里面随机地返回3个元素。(3为正数,返回的元素不会重复;如果是-3,返回的随机元素可能会重复 )
spop 集合名:随机删除一个
smove 集合名 集合名 值:将第一个集合中的一个值移到第二个集合
sdiff 集合名 集合名 集合名:得到存在与第一个集合,但不存在与其他集合的值(差集运算)
sdiffstore 指定集合名 集合名 集合名 集合名:将存在与第一个集合,但不存在与其他集合的值移到指定集合
sinter 集合名 集合名 集合名:得到所有集合同时存在的值(交集运算)
sinterstore 指定集合名 集合名 集合名 集合名:将所有集合同时存在的值移到指定集合
sunion 集合名 集合名 集合名:得到所有集合的值(并集运算)
sunionstore 指定集合名 集合名 集合名 集合名:将所有集合的值移到指定集合
有序集合:zset
数据有序且键值对唯一的集合
场景:排行榜:根据积分排序从小到大。获取某个范围的数据:考试80-100分的数据
zadd 集合名 score值 值 score值 值
zrem 集合名 值 值:删除
zremrangebyrank 集合名 结束值 开始值:删除集合排名在某个范围之间的值
zremrangebyscore 集合名 结束值 开始值:删除集合score值在某个范围之间的值
zincrby 集合名 3 值:给集合某个值的score加3
zcard 集合名:个数
zcount 集合名 开始值 结束值:得到集合score值在某个范围的值的个数
zscore 集合名 值:得到某个值在集合中的score值
zrank 集合名 值:得到某个值在集合中的排名(排名从0开始)(最小的排名为0)
zrevrank 集合名 值:按score值从大到小排列,得到某个值的排名
zrange 集合名 开始值 结束值 withscores:得到集合排名在某个范围之间的值(从小到大),如果加上withscores,也会得到score值
zrevrange 集合名 开始值 结束值 withscores:得到集合排名在某个范围之间的值(从大到小),如果加上withscores,也会得到score值
zrangebyscore 集合名 开始值 结束值 withscores limit 开始下标 结束下标:集合score值在某个范围之间的值(从小到大),如果加上withscores,也会得到score值,如果加上limit 开始下标 结束下标,是得到在排好顺序基础上的某个范围的值,即可进行分页查询功能
zrevrangebyscore 集合名 结束值 开始值 withscores 开始下标 结束下标:集合score值在某个范围之间的值(从大到小),如果加上withscores,也会得到score值,如果加上limit 开始下标 结束下标,是得到在排好顺序基础上的某个范围的值,即可进行分页查询功能
zinterstore 指定集合名 后面集合名的个数 集合名 集合名:求值的交集,然后将交集结果存到指定集合里一份(score值会进行加法运算)
zunionstore 指定集合名 后面集合名的个数 集合名 集合名:求值的并集,然后将并集结果存到指定集合里一份(score值会进行加法运算)
地理位置:Geo(Geospatical)(版本要求:Redis3.2)
GEO底层的实现原理其实就是Zset,我们可以使用Zset命令来操作GEO
场景:定位、查看附近的人、朋友的定位、打车距离计算
geoadd 集合名 经度 维度 地名 经度 维度 地名
geopos 集合名 地名:返回所有给定位置元素的位置(经度和纬度)
geodist集合名 地名 地名 单位:返回两个给定位置之间的直线距离(单位默认是m,单位还有km mi(英里) ft(英寸))
georadius 集合名 经度 纬度 半径 单位 withdist withcoord withhash asc/desc count 2:以给定的经纬度为中心,找出某一半径内的元素(withdist是将位置元素与中心之间的距离也一并返回)(withcoord是将位置元素的经度和维度也一并返回,即显示他人的定位信息)(withhash是以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。)(asc/desc:asc是根据中心的位置, 按照从近到远的方式返回位置元素,desc是根据中心的位置, 按照从远到近的方式返回位置元素)(count 2是指定返回几个地点)
georadiusbymember 集合名 地名 半径 单位:找出位于指定范围内的元素,中心点是由给定的位置元素决定(以当前地名为中心,找出半径以内的元素)
geohash 集合名 地名 地名:返回一个或多个位置元素的Geohash字符串(将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近)(11个字符)
位图场景:Bitmap
Bitmap是位图,数据结构,都是操作二进制位来进行记录,就只有0和1两个状态
场景:统计用户信息、活跃、不活跃、登录、未登录、打卡等等… 两个状态的都可以使用Bitmap
setbit 集合名 键名 值:(值只能为0或者1)
getbit 集合名 键名:获取集合中某个键的值
bitcount 集合名:获取集合中值为1的键的个数
基数统计:Hyperloglog
一个可重复集合内不重复元素的个数就是基数
传统的方式:使用set保护用户的ID,然后就可以统计set中的元素数量作为标准判断,这个方式如果保存大量的用户id,就会比较麻烦。我们的目的是为了计数,而不是存储用户id。
优点:占用的内存是固定的,2^64不同元素的技术,只需要费12KB内存。如果要从内存角度来比较的话,Hyperloglog是首选
如果允许容错,那么一定要使用Hyperloglog;如果不允许容错,就使用set或者自己的数据类型即可。(容错就是当由于种种原因在系统中出现了数据、文件损坏或丢失时,系统能够自动将这些损坏或丢失的文件和数据恢复到发生事故以前的状态,使系统能够连续正常运行的一种技术,很简单的意思)
场景:页面统计,网页的UV(一个人访问一个网站多次,但是还是算作一个人)
pfadd 集合名 值 值:添加一个或者多个元素
pfcount 集合名:统计集合中基数的个数
pfmerge 新集合名 集合名 集合名:合并集合的元素,并且剔除其中重复的元素,产生新的集合
redis击穿
redis键过期,请求去MySQL
设置永不过期时间
redis穿透
redis本来就没有的键,请求去MySQL(恶意请求)
布隆过滤器
redis雪崩
redis大量键过期
设置条件查询判断,如果redis没有要查询的数据,就去数据库查
加分布式锁,第一个查询线程从数据库取出数据,把数据存到redis,第二个查询线程再进去
如果第一个线程在数据库也没查询到数据,则把null存到redis