Redis -- 基础知识3 数据类型及指令

FLUSHALL:清空所有键值对操作(最好别搞,删库要被绳之以法的)

1.string类型

1.介绍

1.redis的字符串,直接按照二进制进行存储,所以可以存储任何数据,取出时不需要转码

2.redis的string类型,限制大小最大为512M,因为为单线程模型为了操作短平快

2.操作

1.set与get

set key value [ex seconds | px iseconds] [NX | XX]:添加string类型的键值对

1.一个语句可追加多条操作,而且合并的操作是原子性的

2.NX:如果key存在,则不设置,不存在则设置 ; XX:key存在更新设置,不存在不设置

3.如果key存在,则覆盖value,并且ttl也会失效

get key:获取key,只支持string类型的操作,如果不是会报错

2.mset与mget

操作多组键值对,减少了网络传输次数,增加效率

mset key value [key value...]:多次添加,但不是不要加太多,会使得redis阻塞

mget key [key]:一次性查找多次

3.setnx/setex/psetex

setnx: set同时设置nx选项,如果key存在,则不设置,不存在则设置

setex: 添加键值对并且设置超时时间

psetex:添加键值对并且设置毫秒级超时时间

4.incr/incrby/decr/decrby/incrbyfloat

value类型为int类型才能操作,并且数不能超过范围.操作的时间复杂度都是O(1),多客户端一起发送也不会出现线程安全问题

incr key: value+1 (64位),如果key不存在,当作当作value为0的键值对

incrby key n: value+n,n为正负数都可以

decr key: value-1

decrby key n: value-n,n为正负数都可以

incrbyfloat key n: value +/- 小数

5.append/getrange/setrange/strlen

append key value: 追加字符串,如果key没有则功能等于set.返回值的长度是字节

编码字节大小由shell设置,utf-8的汉字字节为3字节.get汉字不会返回汉字,会返回编码.需要在启动客户端时加上 --raw 的选项,客户端就会尝试翻译

getrange key start end: 获取字符串的一部分,区间范围为[start,end].负数表示倒数第几个.切分汉字可能会出现问题

setrange key offset value: 将offset位置的数据开始替换成value.替换结束返回新字符串的长度.如果当前替换的是汉字,那么可能会出现问题

strlen key:获取到字符串的长度,单位为字节

3.string编码方式

int: 8字节的长整型

embstr: 小于等于39字节的字符串

raw: 大于39字节的字符串

小数存储为一个字符串,而不是int类型.所以进行加减运行会进行转换

4.应用场景

1.作为缓存

应用服务器访问数据时,先查redis中是否存在,如果有直接返回给服务器;如果没有则在MySQL中寻找,并且将数据存一份到redis中.其功能就是把缓存用于存储热点数据,不过热点数据选择的策略是人为定义的.随时间推移key会越来越多,那么我们需要可以设置超时时间.当然redis在内存不足时,提供了淘汰机制.

2.计数

例如统计视频的观看次数.如果统计TopK的数据不太可以,使用MySQL更好

3.共享会话(session)

每一个服务器都在redis中维护同一份session,只要每个请求过来,每一个服务器都能对该请求进行处理与响应

2.hash类型

key field value形式,key对应一整个hash表

1.命令

1.hset/hget/hexists

hset key field value [field value...]:针对key跟上若干field与value的键值对.返回值为键值对的个数,value的类型为字符串

hget key field: key找到hash表,通过field找到value

hexists key field: 判断hash表中是否存在field

2.hdel

hdel key field[key field...]: 删除的是field,而不是key.返回删除的字段个数

3.hkeys/hvals

hkeys key: 查看所有field字段.找到hash,遍历hash的所有field.该操作有一定风险,与keys *差不多的错误

hvals key: 获取key中的所有value

4.hgetall/hmget

hgetall key: 查看所有field和对应的value,不推荐使用

hmget key field [field...]: 查看指定多个field的value

hscan key:渐进式遍历.敲一次遍历一部分

5.hlen/hsetnx/hincrby/hincrbyfloat

hlen key: hash的filed-value键值对个数,时间复杂度为O(1)

hsetnx key field value: 不存在则设置,存在则失败

hincrby key field n: hash的value也可当成整数,加减正负都行

hincrbyfloat key field n: hash的value也可当成浮点数,加减正负都行

2.hash编码方式

ziplist:压缩链表,适用于元素个数少,每个value的长度比较短

hashtable:hash表

3.应用

作为缓存:存储结构化的数据,类似于数据库的表结构.

1.hash类型是稀疏的,而关系型数据库是完全结构化的

2.关系型数据库可做复杂性查询,而redis不可以

3.list类型

类似于双端队列(deque),链表中的元素允许重复,下标从0开始

1.命令

1.lpush/lrange/lpushx/rpush

lpush key value [value...] :头插,返回值为list的长度

lrange key start end :查看[start,end]的区间,越界会返回能得到的所有数据

lpushx key value [value...] :key存在才头插

rpush key value [value...] :尾插,返回值为list的长度

2.lpop/rpop

lpop key :头删,返回删除元素值,或者返回空

rpop key :尾删,返回删除元素值,或者返回空

3.lindex/linsert/llen

lindex key index:给定下标,返回对应元素,时间复杂度为O(N)

linsert key pivot value :按顺序找pivot基准值,在其前面或者后面插入value元素,返回元素个数,时间复杂度为O(N)

llen key :获取list的元素个数

4.lrem

lrem key count element :count>0,删除element开始从左往右删除count次 ; count<0,删除element开始从右往左删除count次 ; count=0,删除所有的element

5.ltrim/lset

ltrim key start stop: 保留[start,stop]间元素

lset key index element: 修改任何位置的元素

6.阻塞式命令

阻塞:一旦list数据为空就会阻塞

blpop和brpop如果在list数据为空就会产生阻塞,直到list中有数据为止,当然可以设置阻塞时间,一旦超时就不再等待.返回一个二元组,哪个key取出哪个数据

blpop key [key...] timeout :一旦多个key存在一个数据,那么就会执行

brpop key [key...] timeout

2.list编码方式

ziplist: 压缩链表,节省空间,适用于元素个数少

linkedlist: 真实链表,适用于元素个数多

quicklist: redis5之后使用现在的结构,结合了ziplistlinkedlist,整体是链表,但是每一个元素是压缩链表

3.应用场景

1.list作为数组,存储多个元素

2.消息队列(生产者消费者模型),轮询模型

Redis -- 基础知识3 数据类型及指令_第1张图片

4.set类型

1.命令

1.sadd/smembers

sadd key member [member...]: 添加set的元素,返回添加成功的元素

smembers key :key中所有的元素

sismember key member :测试某一个member是否存在

2.spop/srandmember

spop key count: 随机删除count个元素

srandmember key count:随机获得count个元素

在源码中,针对spop与srandmember就采取了生成随机数的操作

3.smove/srem

smove key1 key2 member:从key1中删除member再加到key2中

srem key member [member...]: 删除指定元素,返回删除的个数

4.集合间操作

1.交集:

sinter key [key..]: 获取交集,时间复杂度为O(n*m)

sinterstore des key [key..]: 算好交集存到des中

2.并集:

sunion: 求并集,时间复杂度为O(n)

sunionstore des key [key..]: 求并集存到des中

3.差集:

sdiff key [key...]: 第一个key为参考,时间复杂度为O(n)

sdiffstore des key [key..]: 求差集存到des中

2.set编码方式

intset:整数集合,节省空间的特定优化,元素均为整数,元素个数不多的情况下使用

hashtable:哈希表

3.应用场景

1.保存特征形成标签,并且方便计算交集,找到两个集合的公共标签

2.使用set计算用户之间的共同好友

3.使用set统计UV,去重.(pv:page view用户每次访问都会产生一个pv;uv:user view一个用户产生一个uv)

5.zset

1.命令

1.zadd

zadd key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]: key中添加一个含score的member,返回值为新增的元素个数(不显示修改).时间复杂度为O(logN),主要因为跳表.修改后顺序会自动变换

不加[NX | XX]:不存在member就添加新的member,存在就更新member

NX:存在时不设置,没有member更新member

XC:更新存在的member

LT:只更新存在的元素,更新元素比要被更新的小才更新

GT:只更新存在的元素,更新元素比要被更新的大才更新

CH:返回值进行描述,原本返回添加的元素个数,加入CH则也会返回被修改的元素个数

INCR:对现有member能加减操作

特别的:score可以为浮点数,zset的排序默认为升序方式排列

2.zcard/zcount

zcard key:获取元素个数(member数量).时间复杂度为O(1)

zcount key min max: score在max和min之间的member个数,(max (min这样写不包含两端.时间复杂度为O(logN).max和min可以是浮点数,可以使用inf正无穷大和-inf负无穷大

3.zrange/zrevrange/zrangebyscore

zrange key start end [withscores]:查看[start,end]下标之间的元素,withscores现实members的score.时间复杂度为O(log(N)+M),升序查询

zrevrange key start end [withscores]:降序查询

zrangebyscore key min max [withscores] :查询分数范围内的元素

4.zpopmax

zpopmax key [count] :删掉count个最大的score对应的元素.如果元素的score相同,那么此时删除按照member的大小顺序进行一个一个删除.

删除的是最大的数据,那么其实等于是尾删.其时间复杂度为O(logN)

5.bzpopmax/bzpopmin

bzpopmax key [key...] timeout :删除最大的数一次,zset为空时阻塞,阻塞超时时间为timeout,并且单位为秒,支持小数

bzpopmin key [key...] timeout:删除最小的数一次,zset为空时阻塞,阻塞超时时间为timeout,并且单位为秒,支持小数

时间复杂度都是O(logN),key有很多也是一次

6.zrank/zrevrank/zscore

zrank key member: 查看member对应的下标,member不存在返回空.以升序的顺序算的

zrevrank key member:以逆序的顺序算的

zscore key member:查询指定member的score,时间复杂度为O(1) - 查询优化了

7.zrem/zremrangebyrank/zremrangebyscore

zrem key member [member...]: 删除member元素,返回删除元素个数.时间复杂度为O(logN*M)

zremrangebyrank key start end:下标描述范围进行删除元素.时间复杂度为O(logN+M)

zremrangebyscore key start end:分数描述区间进行删除元素.时间复杂度为O(logN+M)

8.zincrby

zincrby key increment member:对member的score增加increment

9.有序集合间关系操作

zinter交集,zunion并集,zdiff差集 -- redis6.2之后支持的

zinterstore des numkeys key [key...] [WEIGHT weight [weight...]] [AGGREGATE ]:交集,存在指定key中

zunionstore des numkeys key [key...] [WEIGHT weight [weight...]] [AGGREGATE ]:并集,存在指定key中

numkeys:多少个key进行交集运算.之所以需要显示,是因为若干个keys之后还有可有可无的操作,需要进行区分

WEIGHT:乘以权重,操作的优先级标准.即对member求交集同时要计算score权重的占比.要算权重那WEIGHT必须写

AGGREGATE:总数合计.SUM为score的总和,MIN为score最小值,MAX为score的最大值

zinterstore的时间复杂度为O(N*K)+O(M*logM),N为最小zset个数,K为numkey,M最终个数.约等于O(M*logM)

zunionstor的时间复杂度为O(N)+O(M*logM),N为所有zset个数

2.zset的编码方式

1.ziplist:适用于元素个数少,单个元素体积小.节省内存空间

2.skiplist:适用于元素个数多,单个元素体积大.查询的时间复杂度为O(logN)

3.应用场景

关键场景:实时的排行榜,可以高效更新

游戏排行看分数,单一的

其他综合热度,需要进行权重计算

你可能感兴趣的:(实用工具,redis,数据库,缓存)