1.redis是什么
Remote Dictionary Server(远程字典服务)是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的key-value数据库提供了丰富的数据结构,例如String、Hash、List、Set、Sorted等等。数据是存在内存中的,同时Redis支持事务、持久化、LUA脚本、发布/订阅、缓存淘汰、流技术等多种功能特性提供了主从模式、Redis Sentinel和Redis Cluster集群架构方案。
2.常用命令
- keys * 查看当前库所有的key
- exists key 判断某个key是否存在
- type key 查看你的key是什么类型
- del key 删除指定的key数据
- unlink key 非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
- ttl key 查看还有多少秒过期,-1表示永远不过期,-2表示已经过期
- expire key 秒钟,为给定的key设置过期时间
- move key dbindex [0,15] 将当前库的key移动到给定的数据库db中
- select dbindex 切换数据库[0,15] 默认为0
- dbsize 查看当前数据库key的数量
牢底坐穿指令
- flushdb 清空当前库
- flushall 通杀全部库
3.数据类型命令及落地应用
备注:命令不区分大小写,而key是区分大小写的。永远的帮助指令,help @类型(help @string,help @list)
3.1 String(字符串)
string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。一个redis中字符串value最多可以是512M
常用指令:
比较常用:
set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
官网翻译如下:
每次使用set key value会重新指定过期时间为永久如果不指定时间。使用keepttl可以保留设置前指定键的生存时间。示例如下:
mset:同时设置一个或者多个key-value对。
mget:获取所有(一个或者多个)给定key的值。
msetnx:同时设置一个或多个key-value对,当且仅当所有给定key都不存在。
getrange:获取指定区间范围内的值,类似between...and的关系。从零到负一表示全部
setrange:设置指定区间范围内的值,格式是setrange key值
setex:设置带过期时间的key,动态设置 秒值
setnx:只有在key不存在时设置key的值
getset:将给定key的值设为value,并返回key的旧值(old value).简单来收就是先get再set
应用场景:
例子一:比如抖音无限点赞某个视频后者商品,点一下加一次
例子二:阅读数:只要点击了文章地址,直接可以使用incr key命令增加一个数字1,完成记录数字
3.2List(列表)
redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它底层实际是个双端链表,最多可以包含2^32 - 1个元素(4294967295, 每个列表超过40亿个元素)。
主要功能由push/pop等,一般用于栈、队列、消息队列等场景。
left、right都可以插入添加;
如果键不存在,创建新的链表
如果键已存在,新增内容
如果值全部移除,对应的键也就消失了。
对两端的操作性能很高,通过索引下标的操作中间的节点性能会比较差。
常用指令如下:
lpush:将一个或者多个值依次放到左边
lrange:遍历list
lpop、rpop:从左右两边移除数据
lindex:通过索引获取列表中的元素
lrem key 数字N:从左到右删除N个值等于key的元素,返回的值为实际删除的数量。
lrem list3 0 -1 表示删除全部给定值。
ltrim:截取指定区间的元素,格式是ltrim list的key 起始索引 结束索引
rpoplpush:移除列表的最后一个元素,并将该元素添加到另一个列表并返回
lset key index value:将list的索引为index的值替换成value
linsert key before/after 已有值 插入的新值:在list某个已有值的前后再添加具体值
应用场景:微信公众号订阅号的消息
3.3 哈希Hash
Redis hash是一个string类型的field(字段)和value(值)的映射表,hash特别适合用于存储对象。KV模式不变,但V是一个键值对 Map<string,Map<object,object>>
常用命令:
hset/hget/hmset/hmget/hgetall/hdel:
hlen: 获取某个key内的全部数量
hexists key:在key里面的某个值的key
hkeys/hvals:
hincrby/hincrbyfloat:
hsetnx:
应用场景:
JD购物车早期 设计目前不再采用,当前小中厂可用
3.4 集合set
Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不可能出现重复的数据,集合对象的编码可以是insert或者hashtable。set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是o(1).
常用命令:
案例:
sadd/smembers
sismember key member:
srem key member:
scard 获取集合里面的元素个数:
srandmember key N:从集合中随机展示设置N个元素,元素不删除
spop key N:从集合中随机弹出N个元素,出一个删一个
smove key1 key2:在key1里已存在的某个值,将key1里已经存在的某个值赋给key2
集合差集 sdiff key1 key2 :属于key1但是不属于key2
集合并集 属于A或者属于B sunion key1 key2:
集合交集 sinter key1 key2 :属于A同时也属于B
应用场景:
1.微信抽奖小程序:
2.微信朋友圈点赞查看同赞朋友
3.qq内推可能认识的人
3.5 有序集合Zset(sorted set)
zset和set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数去可以重复,并且zset是通过哈希表实现的,所以添加,删除,查找的复杂度都是o(1).
常用:
案例:
zadd key score member 添加元素:
zrevrange:按照分数反向排序
zrangebyscore key min max :获取指定分数范围的元素 ( 表示不包含
zcard: 获取集合中元素的个数
zcount:获取分数区间内元素个数,zcount key 开始分数区间 结束分数区间
zrank:获取valuezaizset中的下标位置
zscore:按照值获取对应的分数
zrem:删除元素,格式是zrem zset的key项的值,项的值可以是多个,zrem key score某个对应,可以是多个
zmpop:
zrevrank key values值:
应用场景:根据商品销售对商品进行排序显示
3.6 位图bitmap
基本命令:
案例:
setbit
strlen:
bitcount:全部键里面含有1的有多少个
bitop:
getbit:
一年365天,全年天天登录占用多少字节
按年去存储一个用户的签到情况,365 天只需要 365 / 8 ≈ 46 Byte,1000W 用户量一年也只需要 46 * 10000000 / (1024 * 1024)= 440 MB 就足够了
假如是亿级的系统,
每天使用1个1亿位的Bitmap约占12MB的内存(10^8/8/1024/1024),10天的Bitmap的内存开销约为120MB,内存压力不算太高。
此外,在实际使用时,最好对Bitmap设置过期时间,让Redis自动删除不再需要的签到记录以节省内存开销。
3.7 HyperLogLog
HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是,再输入元素的数量或者体积非常大时,计算基数所需的空间总是固定且是很小的。
在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同的元素的基数。这和计算基数时,元素越多耗费内存就越多的几何形成鲜明的对比。但是,因为HyperLogLog只会根据输入元素来计算基数,而不会存储输入元素本身,所以HyperLogLog不能像集合那样,返回输入的各个元素。
需求:统计某个网站的UV(Unique vistor,独立访客,一般理解为客户端IP),用户搜索网站关键词的数量,统计用户每天搜索不同词条的个数。
基数:是一种数据集,去重复后的真实个数
基本命令:
3.8 CEO地理空间
主要用于存储地理位置信息,并对存储的信息进行操作,包括 1.添加地理位置的坐标。2.获取地理位置的坐标。3.计算两个位置之间的距离。根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
简介:
原理:
常用命令: