❶ Redis --- 八种数据类型(基本命令)
String、Hash、List、Set和Zset。
等同于java中的, Map<String,String> string 是redis里面的最基本的数据类型,一个key对应一个value。
应用场景 :String是最常用的一种数据类型,普通的key/value存储都可以归为此类,如用户信息,登录信息和配置信息等;
实现方式 :String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作(自增自减等原子操作)时会转成数值型进行计算,此时redisObject的encoding字段为int。
Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能。 Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS。
Redis的字符串也会遵守C语言的字符串的实现规则,即 最后一个字符为空字符。然而这个空字符不会被计算在len里头。
Redis动态扩展步骤:
Redis字符串的性能优势
常用命令 :set/get/decr/incr/mget等,具体如下;
ps:计数器(字符串的内容为整数的时候可以使用),如 set number 1。
补充:
等同于java中的: Map<String,Map<String,String>> ,redis的hash是一个string类型的field和value的映射表, 特别适合存储对象。 在redis中,hash因为是一个集合,所以有两层。第一层是key:hash集合value,第二层是hashkey:string value。所以判断是否采用hash的时候可以参照有两层key的设计来做参考。并且注意的是, 设置过期时间只能在第一层的key上面设置。
应用场景 :我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、年龄和生日,通过用户ID我们希望获取该用户的姓名或者年龄或者生日;
实现方式 :Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口。如,Key是用户ID, value是一个Map。 这个Map的key是成员的属性名,value是属性值 。这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据。 当前HashMap的实现有两种方式 :当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时redisObject的encoding字段为int。
常用命令 :hget/hset/hgetall等,具体如下:
等同于java中的 Map<String,List<String>> ,list 底层是一个链表,在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一样插入两层的key。 list是一种有序的、可重复的集合。
应用场景 :Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现;
实现方式 :Redis list的实现为一个 双向链表 ,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括 发送缓冲队列 等也都是用的这个数据结构。
常用命令 :lpush/rpush/lpop/rpop/lrange等,具体如下:
性能总结 :
它是一个字符串链表,left、right都可以插入添加。
等同于java中的 Map<String,Set<String>> ,Set 是一种无序的,不能重复的集合。并且在redis中,只有一个key它的底层由hashTable实现的,天生去重。
应用场景 :Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动去重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且 set提供了判断某个成员是否在一个set集合内的重要接口 ,这个也是list所不能提供的;如保存一些标签的名字。标签的名字不可以重复,顺序是可以无序的。
实现方式 :set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
常用命令 :sadd/spop/smembers/sunion等,具体如下:
ZSet(Sorted Set:有序集合) 每个元素都会关联一个double类型的分数score,分数允许重复,集合元素按照score排序( 当score相同的时候,会按照被插入的键的字典顺序进行排序 ),还可以通过 score 的范围来获取元素的列表。
应用场景 :Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以 通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。 当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
底层实现 : zset 是 Redis 提供的一个非常特别的数据结构,常用作排行榜等功能,以用户 id 为 value ,关注时间或者分数作为 score 进行排序。实现机制分别是 zipList 和 skipList 。规则如下:
zipList:满足以下两个条件
skipList:不满足以上两个条件时使用跳表、组合了hash和skipList
为什么用skiplist不用平衡树?
主要从内存占用、对范围查找的支持和实现难易程度这三方面总结的原因。
拓展:mysql为什么不用跳表?
常用命令 :zadd/zrange/zrem/zcard等;
官网地址: https://redis.io/commands/geoadd
可以用来推算两地之间的距离,方圆半径内的人。
关于经度纬度的限制: https://www.redis.net.cn/order/3685.html
一般我们使用Hyperloglog做基数统计。
什么是基数?就是一个集合中不重复的数的个数。
集合A:{1,3,5,7,9,7}
集合B:{1,3,5,7,9}
AB集合的基数都是5
应用:统计网站的访问量(一个人访问网站很多次仍然算作一次)。
优点:占用的内存是固定的,找2^64次方个数的基数,只需要12KB内存。
缺点:有0.81%的错误率,可以忽略不计
概述: bitmap 存储的是连续的二进制数字(0 和 1),通过 bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。 我们知道 8 个 bit 可以组成一个 byte,所以 bitmap 本身会极大的节省储存空间。
应用场景: 适合需要保存状态信息(比如是否签到、是否登录...)并需要进一步对这些信息进行分析的场景。比如用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)。
针对上面提到的一些场景,这里进行进一步说明。
使用场景一:用户行为分析 很多网站为了分析你的喜好,需要研究你点赞过的内容。
使用场景二:统计活跃用户
使用时间作为 key,然后用户 ID 为 offset,如果当日活跃过就设置为 1
那么我该如果计算某几天/月/年的活跃用户呢(暂且约定,统计时间内只有有一天在线就称为活跃),有请下一个 redis 的命令
使用场景三:用户在线状态
对于获取或者统计用户在线状态,使用 bitmap 是一个节约空间效率又高的一种方法。
只需要一个 key,然后用户 ID 为 offset,如果在线就设置为 1,不在线就设置为 0。
补充 :
巨人的肩膀:
https://www.cnblogs.com/Small-sunshine/p/11687809.html
https://mp.weixin.qq.com/s/CMu7oXVIKp2s-PXTdMlimA
❷ Redis | Redis 字符串相关命令
Redis 支持多种数据结构,比如 字符串、列表、集合、有序集合 和 哈希 等数据结构。本次我整理了关于 字符串 相关的命令,也就是关于 Strings 相关的命令,如下图。
上图中用红色圈中的部分,就是关于 字符串 相关的命令。如果想要在 Redis 中查看相关的命令也可以使用 help 命令来进行查看,命令如下。
在按下回车后,可以看到相应分类命令的说明,如下图。
图中就是部分关于 Strings 相关的部分命令。
常用 Strings 相关命令
为了大家能够直接复制命令进行测试,下面我就不截图了。
1、set 命令
set 命令的作用是 设置一个 key 的 value 值
设置 key 对应的字符串类型
上面的命令分别对 key1 设置为 value1,对 key2 设置为 value2。
set 命令除了基本的用法外,还有几个参数,先来说一下 nx 和 xx 两个参数。
nx 表示 key 不存在时,执行操作
xx 表示 Key 存在时,执行操作
命令 set k1 v1 nx 表示,当 k1 不存在时,给 k1 设置字符串值为 v1,此时 k1 并不存在,因此该命令被执行;
命令 set k2 v2 xx 表示,当 k2 存在时,给 k2 设置字符串值为 v2,此时 k2 并不存在,因此该命令没有被执行
再介绍另外两个参数,分别是 ex 和 px,ex 和 px 是在进行 set 命令时可以设置过期时间的命令
ex 表示 设置的过期时间以秒为单位
px 表示 设置的过期时间以毫秒为单位
2、setnx 命令
setnx 命令的作用是 当指定的键不存在时给该键设置一个值
该命令类似 set 命令附带了 nx 参数
在上面的命令中,setnx k1 value1,由于 k1 存在,因此命令没有被执行,setnx k2 value2,由于 k2 不存在,因此命令被执行。
当命令执行成功,返回值为 1
当命令执行不成功,返回值为 0
3、get 命令
get 命令的作用是 获取指定 key 的值
该命令已经被多次使用了,演示如下:
4、getset 命令
getset 命令的作用是 设置一个 key 的 value,并获取设置前的值
该命令相当于 先对指定的 key 进行一次 get 操作,再执行一次 set 操作,两个命令合并,可以保证原子性。
5、mget 命令
mget 命令的作用是 一次获取多个 key 的值,如果 key 不存在则返回 nil
可以看到,key3 是不存在的,因此 key3 返回的值是 nil
6、mset 命令
mset 命令的作用是 设置多个key value
7、msetnx 命令
msetnx 命令的作用是 设置多个key value,仅当key不存在时
可以看出,msetnx k4 vv4 k5 vv5 时,此时不存在 k4 和 k5 因此该命令执行成功,在执行 msetnx k4 v4 k5 v5 k6 v6 时,由于 k4 和 k5 已经存在,则使得这条命令执行失败,因此 k4 和 k5 的值仍然是 vv4 和 vv5,并且没有 k6 这个 key。
8、incr 命令
incr 命令的作用是 执行原子加1操作
9、decr 命令
decr 命令的作用是 整数原子减1
10、incrby 命令
incrby 命令的作用是 执行原子增加一个整数
11、decrby 命令
decrby 命令的作用是 原子减指定的整数
12、incrbyfloat 命令
incrbyfloat 命令的作用是 执行原子增加一个浮点数
13、setrange 命令
setrange 命令的作用是 修改字符串指定偏移的值
字符串的偏移从 0 开始,hello 的长度为 5,最后 1 个下标为 4,当我们 setrange kstr 6 x 时,我们将 kstr 下标 6 的位置设置为了 x,因此在下标 5 的位置处给了一个 x00,即 ASCII 码的 0。
14、getrange 命令
getrange 命令的作用是 获取存储在key上的值的一个子字符串
下标 -1 为最后一个下标,下标 -2 为倒数第二个下标
15、append 命令
append 命令的作用是 追加一个值到key上
总结
这些基础的命令当中,除了可以当作基础的操作 字符串 的命令来用,也有其他方面的用处,比如在高并发当中可以用来设置锁等。把今天整理的命令完善了一个思维导图,图片如下。
❸ redis field 是什么意思 跟key是什么关系,比如lpush(key,field,value)应该怎么设置
先说redisredis是一个类似memcached的key/value存储系统,它支持存储的value类型相对较多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件(这点儿个人觉得redis比memcache在数据保存上要安全一些),并且在此基础上实现了master-slave(主从)同步。redis的存取性能很高,SET操作每秒钟110000次,GET操作每秒钟81000次(速度很爽!)。Redis针对不同的存储类型对象提供了不同的命令。redis目前提供四种数据类型:string,list,set及zset(sortedset)。string是最简单的类型,你可以理解成与Memcached一模一个的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。下面提供redis命令:适合全体类型的命令EXISTSkey判断一个键是否存在;存在返回1;否则返回0;DELkey删除某个key,或是一系列key;DELkey1key2key3key4TYPEkey返回某个key元素的数据类型(none:不存在,string:字符,list,set,zset,hash)KEYSpattern返回匹配的key列表(KEYSfoo*:查找foo开头的keys)RANDOMKEY随机获得一个已经存在的key,如果当前数据库为空,则返回空字符串RENAMEoldnamenewname更改key的名字,新键如果存在将被覆盖RENAMENXoldnamenewname更改key的名字,如果名字存在则更改失败DBSIZE返回当前数据库的key的总数EXPIRE设置某个key的过期时间(秒),(EXPIREbruce1000:设置bruce这个key1000秒后系统自动删除)注意:如果在还没有过期的时候,对值进行了改变,那么那个值会被清除。TTL查找某个key还有多长时间过期,返回时间秒SELECTindex选择数据库MOVEkeydbindex将指定键从当前数据库移到目标数据库dbindex。成功返回1;否则返回0(源数据库不存在key或目标数据库已存在同名key);FLUSHDB清空当前数据库中的所有键FLUSHALL清空所有数据库中的所有键处理字符串的命令SETkeyvalue给一个键设置字符串值。SETkeynamedatalengthdata(SETbruce10paitoubing:保存key为burce,字符串长度为10的一个字符串paitoubing到数据库),data最大不可超过1G。GETkey获取某个key的value值。如key不存在,则返回字符串“nil”;如key的值不为字符串类型,则返回一个错误。GETSETkeyvalue可以理解成获得的key的值然后SET这个值,更加方便的操作(SETbruce10paitoubing,这个时候需要修改bruce变成1234567890并获取这个以前的数据paitoubing,GETSETbruce101234567890)MGETkey1key2…keyN一次性返回多个键的值SETNXkeyvalueSETNX与SET的区别是SET可以创建与更新key的value,而SETNX是如果key不存在,则创建key与value数据MSETkey1value1key2value2…keyNvalueN在一次原子操作下一次性设置多个键和值MSETNXkey1value1key2value2…keyNvalueN在一次原子操作下一次性设置多个键和值(目标键不存在情况下,如果有一个以上的key已存在,则失败)INCRkey自增键值INCRBYkeyinteger令键值自增指定数值DECRkey自减键值DECRBYkeyinteger令键值自减指定数值处理lists的命令RPUSHkeyvalue从List尾部添加一个元素(如序列不存在,则先创建,如已存在同名Key而非序列,则返回错误)LPUSHkeyvalue从List头部添加一个元素LLENkey返回一个List的长度LRANGEkeystartend从自定的范围内返回序列的元素(LRANGEtestlist02;返回序列testlist前012元素)LTRIMkeystartend修剪某个范围之外的数据(LTRIMtestlist02;保留012元素,其余的删除)LINDEXkeyindex返回某个位置的序列值(LINDEXtestlist0;返回序列testlist位置为0的元素)LSETkeyindexvalue更新某个位置元素的值LREMkeycountvalue从List的头部(count正数)或尾部(count负数)删除一定数量(count)匹配value的元素,返回删除的元素数量。LPOPkey弹出List的第一个元素RPOPkey弹出List的最后一个元素RPOPLPUSHsrckeydstkey弹出_srckey_中最后一个元素并将其压入_dstkey_头部,key不存在或序列为空则返回“nil”处理集合(sets)的命令(有索引无序序列)SADDkeymember增加元素到SETS序列,如果元素(membe)不存在则添加成功1,否则失败0;(SADDtestlist3/none)SREMkeymember删除SETS序列的某个元素,如果元素不存在则失败0,否则成功1(SREMtestlist3/None)SPOPkey从集合中随机弹出一个成员SMOVEsrckeydstkeymember把一个SETS序列的某个元素移动到另外一个SETS序列(SMOVEtestlisttest3/ntwo;从序列testlist移动元素two到test中,testlist中将不存在two元素)SCARDkey统计某个SETS的序列的元素数量SISMEMBERkeymember获知指定成员是否存在于集合中SINTERkey1key2…keyN返回key1,key2,…,keyN中的交集SINTERSTOREdstkeykey1key2…keyN将key1,key2,…,keyN中的交集存入dstkeySUNIONkey1key2…keyN返回key1,key2,…,keyN的并集SUNIONSTOREdstkeykey1key2…keyN将key1,key2,…,keyN的并集存入dstkeySDIFFkey1key2…keyN依据key2,…,keyN求key1的差集。官方例子:key1=x,a,b,ckey2=ckey3=a,dSDIFFkey1,key2,key3=>x,bSDIFFSTOREdstkeykey1key2…keyN依据key2,…,keyN求key1的差集并存入dstkeySMEMBERSkey返回某个序列的所有元素SRANDMEMBERkey随机返回某个序列的元素处理有序集合(sortedsets)的命令(zsets)ZADDkeyscoremember添加指定成员到有序集合中,如果目标存在则更新score(分值,排序用)ZREMkeymember从有序集合删除指定成员ZINCRBYkeyincrementmember如果成员存在则将其增加_increment_,否则将设置一个score为_increment_的成员ZRANGEkeystartend返回升序排序后的指定范围的成员ZREVRANGEkeystartend返回降序排序后的指定范围的成员ZRANGEBYSCOREkeyminmax返回所有符合score>=min和score=min和score形式的数据,通过key进行任何操作。ttserver可以将数据持久化保存,memcached全部是保存在内存中,memcached会自动删除过期数据,最长不超过30天。memcached在和一些api配合时,能自动进行数据的出入序列化,读取反序列化。ttserver有主从复制的功能,操作日志等,这完全是数据库才有的东西。据说memcached正在对整体架构做调整,到时候支持plugin机制.会把网络,事件处理,内存存储剥离开来.以后要做基于磁盘的key-value存储就可以写一个存储引擎就成了。memcached的二次开发又步入一个小高潮。
❹ redis getset 命令怎么使用方法
[Redis] redis-cli 命令总结
Redis提供丰富命令(command)数据库各种数据类型进行操作些commandLinux终端使用
编程比使用Redis Java语言包些命令都应面Redis提供命令做总结
官网命令列表: (英文)
1、连接操作相关命令
quit:关闭连接(connection)
auth:简单密码认证
2、value操作命令
exists(key):确认key否存
del(key):删除key
type(key):返值类型
keys(pattern):返满足给定pattern所key
randomkey:随机返key空间key
rename(oldname, newname):key由oldname重命名newname若newname存则删除newname表示key
dbsize:返前数据库key数目
expire:设定key间(s)
ttl:获key间
select(index):按索引查询
move(key, dbindex):前数据库key转移dbindex索引数据库
flushdb:删除前选择数据库所key
flushall:删除所数据库所key
3、String操作命令
set(key, value):给数据库名称keystring赋予值value
get(key):返数据库名称keystringvalue
getset(key, value):给名称keystring赋予value
mget(key1, key2,…, key N):返库string(名称key1key2…)value
setnx(key, value):存名称keystring则向库添加string名称key值value
setex(key, time, value):向库添加string(名称key值value)同设定期间time
mset(key1, value1, key2, value2,…key N, value N):同给string赋值名称key istring赋值value i
msetnx(key1, value1, key2, value2,…key N, value N):所名称key istring都存则向库添加string
名称key i赋值value i
incr(key):名称keystring增1操作
incrby(key, integer):名称keystring增加integer
decr(key):名称keystring减1操作
decrby(key, integer):名称keystring减少integer
append(key, value):名称keystring值附加value
substr(key, start, end):返名称keystringvalue串
4、List操作命令
rpush(key, value):名称keylist尾添加值value元素
lpush(key, value):名称keylist添加值value 元素
llen(key):返名称keylist度
lrange(key, start, end):返名称keyliststart至end间元素(标0始同)
ltrim(key, start, end):截取名称keylist保留start至end间元素
lindex(key, index):返名称keylistindex位置元素
lset(key, index, value):给名称keylistindex位置元素赋值value
lrem(key, count, value):删除count名称keylist值value元素
count0删除所值value元素count>0至尾删除count值value元素count<0尾删除|count|值value元素
lpop(key):返并删除名称keylist首元素 rpop(key):返并删除名称keylist尾元素
blpop(key1, key2,… key N, timeout):lpop命令block版本
即timeout0若遇名称key ilist存或该list空则命令结束
timeout>0则遇述情况等待timeout秒问题没解决则keyi+1始list执行pop操作
brpop(key1, key2,… key N, timeout):rpopblock版本参考命令
rpoplpush(srckey, dstkey):返并删除名称srckeylist尾元素并该元素添加名称dstkeylist部
5、Set操作命令
sadd(key, member):向名称keyset添加元素member
srem(key, member) :删除名称keyset元素member
spop(key) :随机返并删除名称keyset元素
smove(srckey, dstkey, member) :member元素名称srckey集合移名称dstkey集合
scard(key) :返名称keyset基数
sismember(key, member) :测试member否名称keyset元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, key1, key2,…key N) :求交集并交集保存dstkey集合
sunion(key1, key2,…key N) :求并集
sunionstore(dstkey, key1, key2,…key N) :求并集并并集保存dstkey集合
sdiff(key1, key2,…key N) :求差集
sdiffstore(dstkey, key1, key2,…key N) :求差集并差集保存dstkey集合
smembers(key) :返名称keyset所元素
srandmember(key) :随机返名称keyset元素
6、zset(sorted set)操作命令
zadd(key, score, member):向名称keyzset添加元素memberscore用于排序该元素已经存则根据score更新该元素顺序
zrem(key, member) :删除名称keyzset元素member
zincrby(key, increment, member) :名称keyzset已经存元素member则该元素score增加increment;
否则向集合添加该元素其score值increment
zrank(key, member) :返名称keyzset(元素已按score排序)member元素rank(即index0始)
若没member元素返nil
zrevrank(key, member) :返名称keyzset(元素已按score排序)member元素rank(即index0始)
若没member元素返nil
zrange(key, start, end):返名称keyzset(元素已按score排序)indexstartend所元素
zrevrange(key, start, end):返名称keyzset(元素已按score排序)indexstartend所元素
zrangebyscore(key, min, max):返名称keyzsetscore >= min且score <= max所元素
zcard(key):返名称keyzset基数 zscore(key, element):返名称keyzset元素element
score zremrangebyrank(key, min, max):删除名称keyzsetrank >= min且rank <= max所元素
zremrangebyscore(key, min, max) :删除名称keyzsetscore >= min且score <= max所元素
zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):Nzset求并集交集
并集合保存dstkeyN于集合每元素score进行AGGREGATE运算前都要乘于WEIGHT参数
没提供WEIGHT默认1默认AGGREGATESUM即结集合元素score所集合应元素进行SUM运算值MINMAX指
结集合元素score所集合应元素值值
7、Hash操作命令
hset(key, field, value):向名称keyhash添加元素fieldvalue
hget(key, field):返名称keyhashfield应value
hmget(key, field1, …,field N):返名称keyhashfield i应value
hmset(key, field1, value1,…,field N, value N):向名称keyhash添加元素field ivalue i
hincrby(key, field, integer):名称keyhashfieldvalue增加integer
hexists(key, field):名称keyhash否存键field域
hdel(key, field):删除名称keyhash键field域
hlen(key):返名称keyhash元素数
hkeys(key):返名称keyhash所键
hvals(key):返名称keyhash所键应value
hgetall(key):返名称keyhash所键(field)及其应value
8、持久化
save:数据同步保存磁盘
bgsave:数据异步保存磁盘
lastsave:返功数据保存磁盘Unix戳
shundown:数据同步保存磁盘关闭服务
9、远程服务控制
info:提供服务器信息统计
monitor:实转储收请求
slaveof:改变复制策略设置
config:运行配置Redis服务器