一.redis简介
redis(Remote Dictionary Server):远程字典服务。基于内存的数据存储系统,适用于数据库缓存、消息队列等场景。
互联网不断发展,应用系统访问量增大,mysql、oracle等不管是数据库、表、表数据都存储在磁盘上,磁盘IO导致数据库性能降低,而磁盘IO读写操作与内存相比非常慢,所以出现redis,与其他数据库相比性能更高。
内存RAM(Random Access Memory,随机访问存储器):临时存储和快速访问数据,cpu可以快速访问和执行,速度是纳秒级别,缺点是断电后数据丢失和容量限制。
磁盘:用于存储数据,由一个或多个旋转的磁性盘片(通常是金属或玻璃制成)组成,比如固态硬盘。通过磁头在磁盘上读写,速度是毫秒级别,断电后数据不会丢失,容量大但是读取时间长。
注:索引将数据存储在特定的数据结构中,可以添加索引提高数据库查询效率,但在插入、更新、删除时也会增加大量的IO操作。
二.redis五种基本数据类型
redis中数据以键值对方式存储,键和值以二进制形势存储,所以可以为数字、布尔值等,但默认不支持中文,区分大小写,默认使用字符串存储数据。
-
字符串String
SET key value //设置键和值
GET key //获取值,若获取键输出值为nil表示该键已被删除
DEL key //删除键
EXISTS key //判断键是否存在,0-不存在,1-存在
KEYS *[参数] //查看数据库中有哪些键,KEYS *会输出所有键,KEYS *name会输出以name结尾的键,若输出empty array则表示键不存在
FLUSHALL //删除缓存中所有键,慎用
EXPIRE key 10 //key值10秒后过期
TTL KEY //查看key值剩余过期时间,若返回为-2则表示已过期,再获取key值表示不存在
SETNX key value //当键不存在时设置键的值,键存在setnx不做任何操作不会修改原来键的值,0-设置键的值失败,1-设置键的值成功
-
列表List
存储和操作一组有顺序的数据,类似于数组的概念。相关命令以L开头。
LPUSH list123 value //添加一个或多个元素到列表中,LPUSH从左到右添加,最后添加的元素会排在最前面;RPUSH从右到左添加,最后添加的元素排在最后面
LRANGE list123 起始位置 结束位置 //获取列表内容,起始位置和结束位置都是以0开始,结束位置为-1时表示最后一个元素
LPOP list123 数字 //LPOP删除列表前两个元素;RPOP删除列表后两个元素
LLEN list123 //查看列表长度
LTRIM list123 1 3 //删除列表中除1到3位置以外的元素,只保留1到3位置的元素
-
集合Set
set是一种无序集合,与列表的区别是:列表中元素按插入顺序排序且可以重复,集合中元素不能重复且是无序的。命令以S开头。
SADD set123 a b c //添加集合,可以添加一个或多个元素,先插入的排在最后面,不允许添加重复的元素
SMEMBERS set123 //查看集合中元素,输出 c b a
SISMEMBER set123 a //查看a是否在集合set123中,1-真,0-假
SREM set123 a //删除集合set123中a元素,若传入a、f 元素,会将存在的元素删除成功
SINTER set123 set456 //查看集合set123和set456的交集,返回两个集合共同存在的元素
SUNION set123 set456 //查看集合set123和set456的并集,返回两个集合中的元素,重复的元素只会出现一次
SDIFF set123 set456 //查看集合set123和set456的差集,返回存在集合set123但不存在set456中的元素,返回元素全部来自于set123
-
有序集合Sortrdset/ZSet
与集合的区别是,有序集合中元素都会关联浮点类型的分数,按分数大小对集合中元素从小到大排序,有序集合中元素是唯一的,但分数是可以重复的,命令以Z开头。
ZADD zset123 3 d 1 a 2 p 2 c //添加有序集合,每个元素由成员和分数组成,分数在前成员在后,中间用空格分隔,存储时若分数一样,会将小的成员排在前面
ZRANGE zset123 0 -1 //输出有序集合全部成员,因为p和c的分数都是2,但c在p之前,输出结果是:a c p d
ZRANGE zset123 0 -1 WITHSORES //输出成员和分数,输出结果为:a 1 c 2 p 2 d 3
ZSCORE zset123 a //查看成员a的分数
注意:ZADD zset123 6 p //成员p已存在,修改p的分数,会重新排序,查看成员分数输出结果为:a 1 c 2 d 3 p 6
ZRANK zset123 a //查看a在集合中index,因为是从小到大排序,输出下标0
ZREVRANK zset123 a//查看a在集合中index,从大到小排序,输出下标3
ZREM zset123 p //删除有序集合中成员p,会连同分数一起删掉
-
哈希Hash
字符类型字段和值的映射表,是键值对的集合,适合存储对象。命令以H开头。
HSET person name aa age 10 score 88 //添加键值对
HGET person name //获取name的值
HGETALL person //获取所有键值对
HDEL person score age //删除一个或多个键值对
HEXISTS person age //查看键值对是否存在
HKEYS person //获取哈希中所有键
三.redis高级数据类型
-
消息队列Stream
消息持久化和记录历史消息。生产者发布消息并添加到消息队列中,消费者从消息队列中读取消息。
XADD x123 1001-0 name aa //添加消息,1001-0为id
XLEN x123 //查看消息数量
XRANGE x123 - + //查看所有消息
XDEL x123 1001-0 //删除id为1001的消息
XTRIM x123 MAXLEN 0 //删除所有消息
XREAD COUNT 2 BLOCK 1000 STREAMS x123 0 //从头读取x123消息队列中2条消息,若消息不存在则延迟1000毫秒
-
地理位置Geospatial
GEOADD city 118.8921 31.32751 nanjing //添加城市信息的经纬度
GEOPOS city nanjing //获取南京的经纬度
GEOSERCH city nanjing BYRADIUS 200 KM //以南京为圆心半径为200km查找其中的城市
-
基数HyperLogLog
基数:两个数据集中不重复的元素。可以做关键词搜索次数统计等。
PFADD name aa bb cc //添加基数
PFCOUNT name //统计基数
pfmerge newdata dataList dataList1
PFMERGE allname name1 name2 //合并name1和name2将结果去重后放入allname
-
位图BIT
字符串类型的扩展,值只有0和1。
SETBIT login 0 1 //设置偏移量0的值为1
GETBIT login 0 //获取偏移量0的值
BITCOUNT login //获取位图中有多少偏移量的值为1
BITPOS login 1 //查看第一个出现1或0的位置
-
位域
对字符串中的位进行读取和设置。
BITFIELD player:1 set u8 #0 1 //key:player:1
表示你的id,u8
表示8位无符号整数,#0
表示第一个位置,1
表示1级