Redis常用的几种类型

133 阅读8分钟

String类型

String类型包含多种类型的特殊类型,并且是二进制安全的,其值可以是数值,可以是字符串,也可以是二进制数据。

类似Java中:Map<String, String/Number> map

在Redis内容数据存储结构:

常用的命令

命令格式功能案例
set key value将key-value缓存redis中set name dafei
get key从redis中获取key对应value值get name
incr key将key对应value值 + 1incr age
decr key将key对应value值-1decr age
setex key seconds value将key-value缓存到redis中,seconds 秒后失效setex sex 10 man
ttl key查看key存活时间ttl sex
del key从redis中删除keydel name
setnx key value如果key已经存,不做任何操作,如果key不存,直接添加setnx name xiaofei

非常用命令

命令格式功能案例
incrby key increment给key对应值加incrementincrby age 10
mset k1 v1 k2 v2....批量添加k1v1 k2v2 key value对mset name dafei age 18
mget k1 k2....批量获取k1, k2的值mget name age
append key value在key对应的value值中拼+valueappend name yes
setrange key offset value修改key对应的value值,替换为指定value,冲offset索引位置开始setrange name 2 xx

应用场景

1>计数器

如:视频播放数系统就是使用redis作为视频播放数计数的基础组件。

incr viewnum 1

2>共享session

出于负载均衡的考虑,分布式服务会将用户信息的访问均衡到不同服务器上,用户刷新一次访问可能会需要重新登录,为避免这个问题可以用redis将用户session集中管理, 在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登录信息都直接从redis中集中获取。

user_login_info:uid---->{"id":1, "name":"dafei", "age":18}

Hash类型

Hash类型是String类型的field和value的映射表,或者说是一个String集合。它特别适合存储对象,相比较而言,将一个对象存储在Hash类型里要比存储在String类型里占用更少的内存空间。

类似Java中:Map<String, Map<String, ?>> map

常用的命令

命令格式功能案例
hset key field value将field value对缓存到redis中hash中,键值为keyhset user name dafei
hget key field从key对应hash列表中获取field字段hget user name
hexists key field判断key对应的hash列表是否存在 field字段hexists user age
hdel key field删除key对应hash列表中field字段hdel user age
hincrby key field increment给key对应hash列表中field字段 + incrementhincrby user age 10
hlen key查看key对应的hash列表field的数量hlen user
hkeys key获取key对应的hash列表所有的field值hkeys user
hvals key获取key对应的hash列表所有的field对应的value值kvals user
hgetall key获取key对应的hash列表中所有的field及其对应的value值hgetall user

应用场景

Hash结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。

共享session设计

public class User{
	private String userame;
	private String password;
	private  int age;
}

登录用户:

User user = new User("dafei", "666", 18);

登录缓存:

key:user_token value:new User("dafei", "666", 18)

----------------------------------------------------------------------------------------------

方案1: 将user对象转换json格式字符串存redis 【侧重于查, 改非常麻烦】

key value

---------------------------------------------------------------------------------------------

user_token"{name:dafei, age:18, password:666}"

方案2: 将user对象转换hash对象存redis【侧重于改,查询相对麻烦】

key value

---------------------------------------------------------------------------------------------

user_token{

name:ddafei

age : 18

password: 666

}

List类型

Redis中的List类似Java中的Queue,也可以当做List来用.

List类型是一个链表结构的集合,其主要功能有push、pop、获取元素等,更详细的说,List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设计非常简单精巧,即可以作为栈,又可以作为队列,满足绝大多数需求.

类似Java中:Map<String, List> map

常用的命令

命令格式功能案例
rpush key value从右边往key集合中添加value值rpush hobby java
lrange key start stop从左边开始列表key集合,从start位置开始,stop位置结束lrange hobby 0 -1
lpush key value从左边往key集合中添加value值lpush hobby c++
lpop key弹出key集合中最左边的数据lpop hobby
rpop key弹出key集合中最右边的数据rpop hobby
llen key获取列表长度llen hooby

非常用命令

命令格式功能案例
linsert key before pivot value操作key集合,在pivot值之前插入valuelinsert hobby before java c#
linsert key after pivot value操作key集合,在pivot值之后插入valuelinsert hobby after java c#
lset key index value操作key集合,更新索引index位置值为valuelset hobby 1 go
lrem key count value操作key集合,删除 count个 value值lrem hobby 3 go
ltrim key start stop操作key集合,从start到stop截取自列表ltrim hobby 2 4
lindex key index操作key集合,获取索引为index位置的数据lindex hobby 1

应用场景

1>用户收藏文章列表:

key:user_favor_article_list

value: [aid1, aid2, aid3......]

Set类型

Set集合是String类型的无序集合,set是通过HashTable实现的,对集合我们可以取交集、并集、差集。

类似Java中:Map<String, Set> map

常用的命令

命令格式功能案例
sadd key members [....]往key 集合中添加member元素sadd myset a b c
smembers key遍历key集合中所有的元素smembers myset
srem key members [....]删除key集合中members元素srem myset a
spop key count从key集合中随机弹出count个元素spop myset 1

非常用命令

命令格式功能案例
sidiffstore dest key1 key2返回key1中特有的元素,并将返回值缓存到dest集合中sidiffstore dest key1 key2
sinter key1 key2返回key1跟key2集合的交集sinter key1 key2
sinterstore dest key1 key2返回key1跟key2集合的交集,并将返回值缓存到dest集合中sinterstore dest key1 key2
sunion key1 key2返回key1跟key2集合的并集sunion key1 key2
sunionstore dest key1 key2返回key1跟key2集合的并集,并将返回值缓存到dest集合中sunionstore dest key1 key2
smove source destination member将source集合中member元素移动到destination集合中smove key1 key2 aa
sismember key member判断member元素是否在key集合中sismember key1 aa
srandmember key count随机获取set集合中count 个元素srandmember key1 1

应用场景

1,去重;

2,抽奖;

​ 1:准备一个抽奖池:sadd luckydraw 1 2 3 4 5 6 7 8 9 10 11 12 13

​ 2:抽3个三等奖:spop luckydraw 3

​ 3:抽2个二等奖:spop luckydraw 2

​ 4:抽1个:一等奖:spop luckydraw 1

Sorted set 类型

Sorted set 也称Zset类型,是一种具有排序效果的set集合。它跟set集合一样也是 string 类型元素的集合,且不允许重复的成员。并且要求每个元素都会关联一个double 类型的分数。后续可以通过分数来为集合中的成员进行从小到大的排序。

Sorted set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

数据缓存结构:

常用的命令

命令格式功能案例
zadd key score member往key集合中添加member元素,分数为scorezadd players 100 a
zincrby key increment member将key集合中的member元素 分数 + incrementzadd players 100 a
zrange key start stop [withscores]将key集合中的元素按分数升序排列 [显式分数]zrange players 0 -1 withscores
zrevrange key start stop [withscores]将key集合中的元素按分数降序排列 [显式分数]zrevrange players 0 -1 withscores
zrank key member返回member元素在key结合中的正序排名zrank players a
zrevrank key member返回member元素在key结合中的倒序排名zrevrank players a
zcard key返回key集合元素个数zcard players

非常用命令

命令格式功能案例
zrangebyscore key min max [withscores]按[min, max) 分数范围返回key集合中元素(正序)zrangebyscore players 200 300 withscores
zrevrangebyscore key min max [withscores]按[min, max) 分数范围返回key集合中元素(倒序)zrevrangebyscore players 200 300 withscores
zrem key member删除key集合中member元素与分数zrem players a
zremrangebyscore key min max withscores按[min, max) 分数范围删除key集合中元素zremrangebyscore players 200 300 withscores
zremrangebyrank key start stop删除key集合正序排名落在[start, stop) 范围元素zremrangebyrank players 10 20
zcount key min max按照分数范围[min, max]统计key集合中元素个数zcount players 100 300

应用场景

排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。