数据类型和常用命令
简介:
Redis全名Remote Dictionary Server(远程字典服务器)是一个高性能的Key-Value数据库提供了主富的数据结构,例如String、Hash、List、Set、SortedSet等等。数据是存在内存中的,同时Redis支持事务、持久化、LUA脚本、发布/订阅、缓存淘汰、流技术等多种功能特性提供了主从模式、Redis Sentinel和Redis Cluster集群架构方案。
命令是不区分大小写的,redis中的key是区分大小写的
Redis默认带有16个数据库,默认使用0数据库,分别是0-15可以通过命令select 0或者select 1来切换不同的互数据库,16是在配置文件中配置的,可以通过修改配置文件来改变数据库的个数。
数据类型:
redis一共有十个数据类型,分别是:
String:字符串,一个key对应一个value,它是二进制安全的(支持序列化)可以包含任何类型的数据,比如图片或者序列化对象,是日常工作中最常用的一个类型,也是适用性最强的一个类型。最多可以存512M的数据
List:字符串列表,底层实现是一个双端链表,可以在List的头部或者尾部插入数据。最多可以存放40亿个元素。
Hash:哈希表,是一个String类型的key对应一个value的映射表,适合存储对象(Map)
Set:集合,是String类型的无序集合,集合成员是唯一的,不可重复的。底层通过哈希表实现,它的添加、删除、查找的操作复杂度都是O(1)
ZSet:Sorted Set,和Set一样也是String类型的元素集合,且不允许元素重复,每个元素都会关联一个Double类型的分数,redis通过分数来对集合中的成员进行从小到大的排序,成员元素是不可重复的,但分数是可以重复的,底层通过哈希表实现,它的添加、删除、查找的操作复杂度都是O(1)
GEO:存储地理位置信息,经纬度,可以添加和获取地理位置的坐标,可以计算两个位置之间的差距。
HyperLogLog:是用来做基数统计的,可以在输入元素的数量或者体积非常大的时候占用固定的且很小的数据空间也就是说可以用很小的空间做很多的事
Bitmap:位图,由0和1状态表现组成的二进制位的bit数组
BitField:通过bitfield命令可以一次性操作多个比特位域(指的是连卖的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作
Stream:流,是5.0版本之后添加的新的数据类型,主要用于消息队列,本身是支持订阅和发布的,但是无法做消息的持久化,如果断网或者宕机会导致数据的丢失,也无法记录历史消息。虽然后续redis提供了持久化和主备复制功能,但在实际应用中队列的操作还是通过MQ来实现的。
Key的常用命令:
keys * 可以查看当前数据库下有哪些key,在生产环境或者大数据两下不能使用,会导致redis被锁,CPU飙升,再生产环境中要禁用。
exists key 可以查看key是否存在,存在返回1代表true,不存在返回0代表false
type key 可以查看key的类型,这里要注意,即使设置的是数字类型,redis也会当字符串存起来,在使用的时候例如做数字的增减的时候redis会自动当数字类型去处理
unlink key 可以非阻塞和的删除key,用于对bigKey的删除,可以先释放key的空间将key中的value挪到其它地方,然后异步删除数据,因为没法在命令行中体现删除过程,这里不做演示
ttl key 用于获取key剩余的过期时间 -1代表永不过期,-2代表已过期,其它正数代表剩余秒数,下图划线处就是很好的例子
expire key 可以给指定的已存在的key设置过期时间
move key dbindex 可以将key移动到指定的数据库中
select dbindex 可以切换数据库
dbsize 统计当前数据库下key的数量
flushdb 清空当前数据库下的所有key
flushall 清空所有数据库下的所有key,暂不做演示
String类型常用命令:
应用场景:用作数据缓存,分摊mysql的访问压力,计数器做自增自减使用,会话管理用于存储用户信息,短信验证码等等
set key value 设置key的值为value
get key 获取key的value
mset key1 value1 key2 value2 key3 value3 同时设置一个或多个kv键值对,是对set的一个升级,m代表multiple,多个的意思
mget k2 k3 k4 同时获取一个或多个给定的key的value,是对get的一个升级,m代表multiple,多个的意思
msetnx key value key value 同时设置一个或多个kv键值对,当且仅当所有给定的key都不存在时,多个kv时只要有一个给定的key存在都会执行失败,执行成功--1 执行失败--0
set key value 当value是数字类型时,redis会将它以字符串进行存储,做自增自减的时候redis会自动将它转成数字类型并做增减操作,数字类型的增加很适合用作抖音或者公众号的点赞数的增减,点一次加一下也可以取消,取消点一下少一个
incr key 对当前数字做自增,默认自增1,相当于java里的i++
incrby key number 对当前数字按照预定的数值做自增
decr key 对当前数字做自减,默认自减1,相当于java里的i--
decrby key number 对当前数字按照预定的数值做自减
strlen key 获取字符串的长度
append key value 在value的末尾追加新的value并返回追加后的value的长度
getset value 顾名思义先get后set,先获取key的value值做返回,并用新的value覆盖旧的值
List类型:
它是一个双端链表的结构,主要功能是push/pop等,通常一个key对应一个或多个value,元素有序且可重复,一般用在栈、队列、消息队列等,left、right都可以插入新的元素,如果key不存在就创建新的链表,如果key已存在就插入元素,如果key被移除了,key下所有的value也就消失了。由于它是一个双端链表,所以对于左右两端的操作性能很高,对于中间按元素的操作性能较差。队列可以从左端、右端插入,但是编列只能从左端开始
应用场景:用来记录用户的操作记录,例如:商品浏览记录,社交平台或资讯类App中用于展示最新的消息或动态
常用命令:
lpush key values 从队列的左端插入一个或多个元素,仅做插入
rpush key values 从队列的右端插入一个或多个元素,仅做插入
lrange key start stop 从队列左端按照指定下表遍历队列,仅做查看
lpop key count 从队列左端弹出指定个数个元素,弹出后元素就被删除了
rpop key count 从队列右端弹出指定个数个元素,弹出后元素就被删除了
lindex key index 根据索引下标获取list中的指定元素,仅做查看
llen key 获取key中元素的个数,做数据统计使用
lrem key count value 因为list元素可以重复,用于从左侧删除队列中N个指定元素
ltrim key start stop 获取key中的start到stop的元素并赋值到当前key
rpoplpush key1 key2 从key1的右端弹出一个元素放到key2的左端,就是把key1的元素剪切到key2中,这个操作可以保证数据操作的原子性
lset key index value 用于在key的指定位置插入元素
linsert key after/before value newvalue 在key中指定value的前或者后插入新的元素
del key 用于删除指定的key,删除后key和key中的value都消失了
Hash类型:
哈希表,和java中的hash类似,单个key对应一个或多个kv键值对
应用场景:可以存储配置信息、购物车信息、用户信息,只要是像java中的hashmap一样的数据存储需要都可以通过Hash类型实现
常用命令:
hset key k1 v1 k2 v2 k3 v3 将一个或多个kv键值对插入到哈希表的key中,有个类似的命令hmset和它一样不做示例
hget key k1 获取哈希表的key中的单个kv键值对
hmget key k1 k2 k3 获取哈希表的key中的一个或多个kv键值对
hgetall key 获取key中全部的kv键值对,以kv的形式返回,打头起,每两行算一个kv键值对
hdel key k1 删除哈希表的key中的指定的kv键值对
hlen key 获取哈希表key的kv键值对的数量
hexists key k1 判断哈希表key中是否存在指定k的名称,存在返回1代表true,不存在返回0代表false
hkeys key 获取哈希表key中所有的kv键值对的key名称
hvals key 获取哈希表key中所有的kv键值对的value的
hinscrby key k number 对哈希表key中的整数类型的指定键名的value值加N
hincrbyfloat key k floatnumber 对哈希表key中的float类型的指定键名的value加floatN
hsetnx key k v 对哈希表key中添加kv键值对,如果kv键值对中的k存在则不添加,不存在则添加新的kv键值对
Set类型:
集合,对标java中的HashSet,单个key对应多个不重复的value,元素无序且不可重复.
应用场景:
qq或者抖音推荐的可能认识的人
微信朋友圈共同好友之间点赞的显示
抽奖小程序的应用
sadd key values 向hashset中插入一个或多个元素,插入元素中如果有重复自动去重后插入
smembers key 获取key中全部的values
sismember key value 判断key中是否存在指定value值,0代表不存在false,1代表存在true
srem key value 删除key中指定的value,如果存在就删除并返回1代表true,如果不存在直接返回0代表false
scard key 获取集合里面元素的个数
srandmember key N 从集合中随机获取N个元素,元素值获取但不删除
spop key N 从集合中随机弹出N个元素,元素值获取后会删除
smove key1 key2 value 从集合key1中获取指定的value然后剪切到key2中
sdiff key1 key2 ... 以第一个key为准获取其它key和它的差集,属于key1但不属于key2的元素,可以是N个key之间的比较
sunion key1 key2 key3 获取多个key之间的并集,将多个key中的元素合并然后去重后返回
sinter key1 key2... 获取多个key之间交集,就是共有的部分,会去重返回
sintercard number key1 key2 limitNumber 用于返回number个key的交集的个数(注意是返回个数),limit可以限制返回的总个数,即使再多也按limit限制的数量返回,不写limit默认返回全部交集的个数,这个limit用来限制大基数的返回情况,虽然基数很大,但我只需要几个即可。
Zset类型:
有序集合,有序且可重复,是对set集合的补充和扩展,zset在set的value前增加了一个score分数值,根据这个分数值来从小到大排序
应用场景:
热度排场榜(score正好可以用作排行榜的分数,非常合适)
根据商品销量、评分对商品进行排序
常用命令:
zadd key 10 k1 20 k2 40 k5 50 k9 60 k7 10 k8 40 k9 像集合key中添加一组或多组score和key
zrange key start end withscore 遍历集合key中的元素,根据给定下标来展示元素,展示时根据score升序排序后展示,withscore用来展示key对应的分数值,注意这里不带withscore只会返回key不返回score
zrevrange key start end withscores 遍历集合key中的元素,根据给定下标来展示元素,展示时根据score降序排序后展示,withscore用来展示key对应的分数值,注意这里不带withscore只会返回key不返回score
zrangebyscore key scoreStart scoreEnd withscores 根据给定的score遍历集合中的key,是根据分数来升序展示这些数据的,withscore用来展示key对应的分数值,注意这里不带withscore只会返回key不返回score,默认是大于等于或者小于等于,如果在分数前添加(代表大于或小于
zscore key member 根据元素中的k名称来获取对应的分数
zcard 获取元素的总个数
zrem key member1 member2... 根据元素中k名称来删除对应的元素和元素对应的分数
zincrby key addScore member 对指定元素k的score增加指定的分数
zcount key startScore endScore 获取指定分数范围内的个数,默认是大于等于或者小于等于,如果在分数前添加(代表大于或小于
ZMPOP numkeys {key [key ...]} {MIN | MAX} [COUNT count] 从一个或多个有序集合中弹出具有最高或最低分数的元素
zrevrank key memberkey 获取key中指定元素k的下标,降序排序
zrank key memberkey 获取key中指定元素k的下标,升序排序
bitmap位图:
位图,是由0和1状态表现组成的二进制位的bit数组只能保存0和1,多用于true/false的状态统计,它是通过string类型实现的,type命令看数据类型的时候会返回string,它是以bit为单位存储的,1bit=8byte,所以每8字节算作一个存储长度,offset会以8为倍数自动扩展,计算长度也是按照bit为单位去计算的,它是String类型的扩展
应用场景:打卡、签到之类的应用场景
常用命令:
setbit key offset value 用于将value存入指定的key的offset中,返回值仅表示旧值,与操作是否成功无关,如果返回0代表首次设置,因为之前没有设置过默认都是0,返回旧值所以是0,如果返回1代表之前有过又重新设置了一遍。
getbit key offset 用于获取key中offset中的value
strlen key 获取key的字节数,一个bit是8byte,第一个红框中偏移量设置的是23,按8来计算3*8=24用了3个bit,所以它的长度是3,而第二个红框中虽然set了三次数据但offset都是8以内的,只占用了一个字节位,所以它的长度是1,这里的长度计算是根据offset所在的字节位来统计的,以8为单位去计算
bitcount key 用于统计key中所有value=1的个数
HyperLogLog:
基数统计,是用于统计一个集合中不重复的元素的个数,可以在输入元素量很大的情况下占用固定的,非常小的空间来完成存储和操作,与数据越多占用空间越大的集合等数据类型形成了鲜明对比,它只会根据输入元素来计算基数,而不会存储元素本身。但是它有一个缺点是会有统计数据的偏差。它的基数统计是估算的,不是100%准确的。
业务场景:统计UV,搜索词检索次数
常用命令:
pfadd key valus... 用于像key中添加N个元素
pfcount key 用于统计key中元素去重后的个数
pfmerge keys... 用于合并多个key的值,将后续key的value合并到第一个key中并去重存储,第一个key可以是新的也可以是旧的key,后面的所有的key的元素都会合并到第一个key中
GEO:
地理空间,本质是一个zset,用于记录地理位置的经纬度坐标。
应用场景:滴滴打车定位,各种地图定位,美图查看附近N公里内的商家
常用命令:
geoadd key 经度 纬度 "地理名称"...... 可以向key中添加一个或多个经纬度以及坐标名,返回添加个数
geopos key "地理名称"...... 获取key中的一个或多个地理名称,不存在时直接返回null
geohash key "地理名称"...... 和geopos类似获取key中的一个或多个地理名称的hash值,不存在时直接返回null,工作中用的多的是这个
geodist key "地理名称1" "地理名称2" m/km/ft/mi 用于返回key中两个地理坐标的距离,m代表mi,km代表公里,ft代表英尺,mi代表英里
georadius key 当前经度 当前纬度 检索距离 检索距离单位 withdist withcoord count 10 desc/asc 用于返回当前经度,当前纬度,检索距离内的坐标信息,也就是获取当前位置N里/公里内的所有坐标信息,如果没有则什么都不返回
withdist:返回元素时一并将各个位置元素和当前位置元素的距离一并返回,距离的单位取决于命令中指定的单位
withcoord:将位置元素的经纬度一并返回
withhash:返回hash值,作用不大
count:返回限定的记录数
Stream:
流,可以理解成Redis中的MQ,用来实现消息队列,它支持消息的持久化、支持自动生成全局唯一ID、支持ack确认消息的模式、支持消费组模式等,让消息队列加的稳定和可靠。但实际应用中消息队列并不会使用redis而是用RocketMQ、kafka等等专业的MQ工具。所以这里不做记录。
原理:它是通过链表来实现的,将所有加入的消息都放入到链表中,每个消息都有一个唯一的ID和对应内容,消息的push和pop和MQ一样,同时也有生产者组和消费者组等等。
应用场景:和MQ相同,不过多赘述。
bitfields:
位域,允许你对一个字符串类型的值按位进行操作,可将其视为一种特殊的数据处理方式,存储在系统中的数据都是以0、1的形式存在的,可以直接通过修改0、1来改变字符串的值。
Redis 的字符串类型可以存储二进制数据,BITFIELD 命令就是基于此特性,允许你把一个字符串当作一系列的位(bit)来处理。你可以在这些位上进行整数的读取、写入、递增和递减等操作,支持不同长度(如 1 位、4 位、8 位、16 位等)和不同符号(有符号和无符号)的整数。
应用场景:很少,主要是为了节省内存使用的。