一、Redis的五大数据类型
1、String(字符串)
String是redis最基本的类型,你可以理解成与Memcached一样,一个key对应一个value。
String类型是二进制安全的,意思是redis的String可以包含任何数据。比如jpg图片或者序列化的对象 。
String类型是Redis最基本的数据类型,一个redis中的value字符串最多可以是512M。
2、Hash(哈希)
类似Java中的Map,Redis的Hash 是一个键值对集合,是一个String类型的field和value的映射表,Hash特别适合用于存储对象,类似Java里面的Map
3、List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际是个链表 。
4、Set(集合)
Redis的Set是String类型的无序集合。它是通过Hashtable实现的。
5、SortedSet(有序集合):操作命令以Z开头
Redis Zset 和 Set 一样也是String类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。Redis正是通过分数来为集合中的成员进行从小到大的排序。Zset的成员是唯一的,但分数(score)却可以重复。
二、Redis常见数据类型操作命令
参考官方文档:Redis命令参考
三、Redis键(key)常用命令
操作 | 用途 |
---|---|
DEL key | 在key存在时删除key |
DUMP key | 序列化给定key,并返回被序列化的值 |
EXISTS key | 检查给定key是否存在,存在返回1,不存在返回0 |
EXPIRE key seconds | 为给定key设置过期时间,key必须事先存在 |
EXPIREAT key timestamp | 和EXPIRE类似,用于为key设置过期时间,不同点在于EXPIREAT接受的时间参数是UNIX时间戳 |
PEXPIRE key milliseconds | 设置key的过期时间,以毫秒计 |
PEXPIREAT key millisseconds-timestamp | 设置key的过期时间戳,以毫秒计 |
KEYS pattern | 查找所有给定模式的key,比如 KEYS * 会查询所有的key |
MOVE key db | 把当前数据库的key移动到指定的db中 |
PERSIST key | 移除key的过期时间,key将持久保存 |
PTTL key | 以毫秒为单位返回key的剩余过期时间 |
TTL key | 以秒为单位返回key的剩余生存时间,-1表示永不过期,-2表示已过期 |
RANDOMKEY | 从当前数据库中随机返回一个key |
RENAME key newkey | 修改key的键名 |
RENAMENX key newkey | 仅当newkey不存在时,将key重命名为newkey |
TYPE key | 返回key存储的类型 |
四、Redis字符串(String)常用操作命令:单key单value
命令 | 作用 |
---|---|
SET key value | 设置指定key的值 |
GET key | 获取指定key的值 |
GETRANGE key start end | 返回key的字符串值的子串 |
GETSET key value | 将给定key的值设置为value,并返回key的旧值 |
GETBIT key offset | 获取key的值的指定偏移量上的字符 |
MGET key1 [key2…] | 获取所有给定key的值 |
SETBIT key offset value | 设置或清除指定key的字符串值对应偏移量上的字符 |
SETEX key seconds value | 设置key的值为value,同时设置过期时间为seconds |
SETNX key value | 在key不存在时设置key的值为value,否则不设置 |
SETRANGE key offset value | 将key的字符串值从偏移量offset开始用value替换 |
STRLEN key | 返回key的字符串值的长度 |
MSET key value [key1 value1 …] | 批量设置多个key-value对 |
MSETNX key value [key1 value1 …] | 批量设置多个key-value对,当且仅当所有的key都不存在才能设置成功 |
PSETEX key milliseconds value | 和SETEX命令类似,不过是以毫秒为单位设置过期时间 |
INCR key | 将key中存储的数字值增加1 |
INCRBY key increment | 将key中存储的数字值增加increment |
INCRBYFLOAT key increment | 将key中存储的浮点数字值增加increment |
DECR key | 将key存储的数字值减1 |
DECRBY key decrement | 将key存储的数字值减decrement |
APPEND key value | 若key存在,且值是一个字符串,则在字符串值末尾追加value |
Tip
:
① set/get/del操作都是成功返回1,否则返回0,append(append key val)操作返回值是追加后字符串的长度,strlen获取键对应字符串的长度
②Incr(整型值加1)/decr(整型值减1)/incrby(incrby key 步长,整型值加多少步长)/decrby(decrby key 步长,整型值减多少步长),一定要是整型数字(Integer)才能进行加减。说明Redis可以根据键入的内容分辨存入的值是数值型还是字符串
③getrange(类似于Java中的subString)/setrange(替换原字符串某个区间的内容):
getrange:获取指定区间范围内的字符串,索引从0开始,类似于subString()方法,或between…and的关系,从0到-1表示取字符串的全部
setrange:设置指定区间范围内的值,格式是setrange key 偏移量 字符串
④ setex(set with expire)键秒值/setnx(set if not exist):
setex:设置带过期时间的key,动态设置。格式:setex 键 秒值 真实值
setnx:只有在 key 不存在时才设置 key 的值,key存在时不重新设置,返回值为1时表示原来没有,返回值为0时表示原来有且没有重新设置
⑤mset/mget/msetnx:同时设置多个值
mset:同时设置一个或多个 key-value 对:
mset k1 vl k2 v2 k3 v3 ......
mget:获取一个或多个给定 key 的值:
mget k1 k2 k3 ......
msetnx:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在时,才能设置成功,否则全部设置失败:
msetnx k1 v1 k2 v2 k3 v3 ......
⑥getset(先get再set):将给定 key 的值设为 value ,并返回 key 的旧值(old value)
五、Redis列表(List):单key多Value,Value可重复
命令 | 作用 |
---|---|
BLPOP key1 [key2…] timeout | 移出并获取列表的第一个元素,如果列表中没有元素会阻塞直到超时或发现有可弹出元素为止 |
BRPOP key1 [key2…] timeout | 移出并获取列表的最后一个元素,如果列表中没有元素会阻塞直到超时或发现有可弹出元素为止 |
BRPOPLPUSH source destination timeout | 从列表中弹出一个值并将弹出的元素插入到另外一个列表中并返回它,如果列表没有元素会阻塞直到超时或发现可弹出元素为止 |
LINDEX key index | 通过索引获取列表中的元素 |
LINSERT key BEFORE|AFTER pivot value | 在列表的元素前或后插入元素 |
LLEN key | 获取列表长度 |
LPOP key | 移出并获取列表的第一个元素 |
LPUSH key value1 [value2…] | 将一个或多个值插入到列表头部 |
LPUSHX key value | 将一个或多个值插入到已存在的列表头部 |
LRANGE key start stop | 获取列表指定范围内的元素 |
LREM key count value | 移出列表元素 |
LSET key index value | 通过索引设置列表元素的值 |
LTRIM key start stop | 对列表进行修剪,只保留列表指定区间内的元素,不在该区间内的元素会被删除 |
RPOP key | 移出并获取列表最后一个元素 |
RPOPLPUSH source destination | 移出列表的最后一个元素并将该元素添加到另一个列表并返回 |
RPUSH key value1 [value2…] | 往列表中添加一个或多个值 |
RPUSHX key value | 向已存在的列表添加值 |
Tip
:
①lpush/rpush/lrange:
lpush/rpush:从左侧或者右侧向指定的list中压入值,可以一次压入多个,返回值是压入值后该list的长度
lpush list v1 v2 v3
lrange:从左侧开始罗列指定List的值,0 -1表示罗列全部
lrange list 0 -1
lrange list 2 5
不能使用get命令获取List的值
②lpop/rpop:从左侧或者右侧弹出指定List的一个值(一次只能弹出一个),返回值为弹出来的这个值
lpop list
rpop list
③lindex:按照索引下标获得元素(从上到下),并不将该元素弹出队列
lindex list 2 #表示查询第三个元素的值
④llen:获取指定List的长度
⑤lrem list n v:从左到右删除指定list中的n个v值,返回值是实际删除的个数,注意当n为0的时候表示的是删除该List中所有的v,而不是不删除v
lrem list 2 v1 #表示从左到右删除list中的2个v1
⑥ltrim list 开始index 结束index:截取指定范围的值后再赋值给原List,相当于java中的subString()方法
ltrim list 3 7
⑦ rpoplpush 源列表 目的列表:从源列表中弹出最后一个值并将该值压入到目的列表,返回值是弹出的值
rpoplpush list1 list2
⑧ lset list index value:为指定List的指定索引index处赋值value,该索引必须存在
lset list 3 hello
⑨linsert list before/after 值1 值2:在指定List的某个值1前或者某个值1后添加值2,注意是值前值后而不是索引前索引后,在List中有多个值1的情况下只会在第一个值1前或后插入值2
linsert list before v1 v2
总结
:
1️⃣List是一个字符串链表,left、right都可以插入添加
2️⃣如果键不存在,创建新的链表;如果键已存在,新增内容;如果值全移除,对应的键也就消失了
3️⃣链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很低了
六、Redis集合(Set):单键多value,但是value不可重复
命令 | 作用 |
---|---|
SADD key member1 [member2] | 向集合中添加一个或多个成员 |
SCARD key | 获取集合中的成员个数 |
SDIFF key1 [key2] | 返回所有给定集合的差集 |
SDIFFSTORE destination key1 [key2] | 返回所有给定集合的差集并存储在destination中 |
SINTER key1 [key2] | 返回所有给定集合的交集 |
SINTERSTORE destination key1 [key2] | 返回所有给定集合的交集并存储在destination中 |
SISMEMBER key member | 判断member元素是否是集合key的成员 |
SMEMBERS key | 返回集合中的所有成员 |
SMOVE source destination member | 将member元素从source移动到destination |
SPOP key | 随机移出并返回集合中的一个元素 |
SRANDMEMBER key [count] | 随机返回集合中的一个或多个元素 |
SREM key member1 [member2] | 移除集合中的一个或多个元素 |
SUNION key1 [key2 …] | 返回所有给定集合的并集 |
SUNIONSTORE destination key1 [key2…] | 将所有给定集合的并集存储在destination中 |
SSCAN key cursor [MATCH pattern][COUNT count] | 迭代集合中的元素 |
Tip
:
①srandmember set 个数:随机从指定set中取出几个成员,如果超过最大数量就全部取出,如果写的值是负数,比如-3 ,表示需要取出3个,但是可能会有重复值
②spop set:从指定set中随机出栈一个value值
③smove set1 set2 set1中某值:将key1里的某值移动到key2
④sdiff set1 set2:取差集,即在第一个set里面而不在后面任何一个set里面的项
⑤sinter set1 set2:取交集,即既在第一个set又在第二个set中的所有元素的集合
⑥sunion set1 set2:并集,在第一个set或者在第二个set中的所有元素的集合
七、Redis哈希(Hash):KV模式不变,但V是一个键值对
命令 | 作用 |
---|---|
HDEL key field [field1] | 删除一个或多个哈希表字段 |
HEXISTS key field | 查看哈希表key中是否存在指定的field |
HGET key field | 获取存储在哈希表中指定key的指定字段的值 |
HGETALL key | 获取在哈希表中指定key的所有字段和值 |
HINCRBY key field increment | 为哈希表key中的指定字段的整数值加上增量increment |
HINCRBYFLOAT key field increment | 为哈希表key中的指定字段的浮点数值增加增量increment |
HKEYS key | 获取所有哈希表中的字段 |
HLEN key | 获取哈希表中字段的数量 |
HMGET key field1 [field2] | 获取所有给定字段的值 |
HMSET key field1 value1 [field2 value2] | 向哈希表key中同时设置多个field-value对 |
HSET key field value | 将哈希表key中的字段field的值设置为value |
HSETNX key field value | 只有在字段field不存在时,设置哈希表字段的值 |
HVALS key | 获取哈希表中所有值 |
HSCAN key cursor [MATCH pattern][COUNT count] | 迭代哈希表中的键值对 |
Tip
:
①hset/hget/hmset/hmget/hgetall/hdel:
hset和hget一次只能操作一个值
hmset和hmget一次能操作多个值,hmset的时候是键值对,hmget是多个键
hmset hash1 id 1 name z3 age 12
hmget hash1 id name age
hgetall hash #取出指定Hash的全部键值对
②hexists hash 在hash里面的某个值的key:查看hash中是否存在某个key
③hkeys/hvals:查询指定Hash中的所有键或者所有键的值
④hincrby/hincrbyfloat:使指定Hash中某个键的值增加多少
⑤hsetnx:当指定Hash中不存在某个key值,就添加该key并赋值,若存在则不做操作
八、Redis有序集合Zset(sorted set):在set基础上加一个score值,之前set是k1 v1 v2 v3,zset是k1 score1 v1 score2 v2,score值用于排序
命令 | 作用 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合中添加一个或多个成员,更新已存在成员的分数 |
ZCARD key | 获取有序集合的成员数 |
ZCOUNT key min max | 计算有序集合中分数在指定区间的成员数量 |
ZINCRBY key increment member | 给有序集合中的指定成员分数加上increment |
ZINTERSTORE destination numkeys key [key1…] | 计算给定的一个或多个有序集合的交集并存储在新的有序集合destination中 |
ZLEXCOUNT key min max | 计算指定有序集合中分数在指定区间的成员数量 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合的成员 |
ZRANGEBYLEX key min max [LIMIT offset count] | 通过字典区间返回有序集合的成员 |
ZRANGEBYSCORE key min max [WITHSCORES][LIMIT] | 通过分数返回有序集合指定区间的成员 |
ZRANK key member | 返回有序集合中指定成员的索引 |
ZREM key member [member…] | 移除有序集合中的一个或多个成员 |
ZREMRANGEBYLEX key min max | 移除有序集合中给定的字典区间的所有成员 |
ZREMRANGEBYRANK key start stop | 移除有序集合中给定的排名区间的所有成员 |
ZREMRANGEBYSCORE key min max | 移除有序集合中给定的分数区间的所有成员 |
ZREVRANGE key start stop [WITHSCORES] | 返回有序集合中指定区间内的成员,通过索引,分数由高到低 |
ZREVRANGEBYSCORE key max min [WITHSCORES] | 返回有序集合中指定分数区间的成员,分数由高到低排序 |
ZREVRANK key member | 返回有序集合中指定成员的排名,有序集成员按分数值递减排序 |
ZSCORE key member | 返回有序集中,成员的分数值 |
ZUNIONSTORE destination numkeys key [key…] | 计算给定的一个或多个有序集的并集,并存储在新的destination中 |
ZSCAN key cursor [MATCH pattern][COUNT count] | 迭代有序集合中的元素,包括成员和分数值 |
Tip
:
①zadd/zrange:注意在值前加上score值
②zrangebyscore key 开始score 结束score:( 表示不包含;Limit 作用是返回限制可用于分页:limit 开始下标步 多少步
③zrem key 某score下对应的value值:作用是删除元素
删除元素:格式是zrem zset的key 项的值,项的值可以是多个
zrem key score某个对应值,可以是多个值
④ zcard/zcount key score区间/zrank key values值,作用是获得下标值/zscore key 对应值,获得分数
zcard :获取集合中元素个数
zcount :获取分数区间内元素个数,zcount key 开始分数区间 结束分数区间
zrank: 获取value在?zset中的下标位置
zscore:按照值获得对应的分数
⑤ zrevrank key values值:作用是逆序获得下标值
zrank zset values 顺序获得索引值
⑥zrevrange
⑦ zrevrangebyscore key 结束score 开始score
注
:Redis中的从左到右相当于查询出来的数据的从上到下