失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > redis 数据类型与使用场景

redis 数据类型与使用场景

时间:2022-12-20 20:05:24

相关推荐

redis 数据类型与使用场景

redis5种数据类型概览

常用key命令

string类型

string是redis最基本的类型,一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如图片或者序列化的对象。String类型是Redis最基本的数据类型,一个键最大能存储512MB

添加数据set age 18

删除数据del age

修改数据set age 20

查看数据get age

增1 / 减1:incr key(加1,但是必须是数字) ,decr key(减1,但是必须是数字)

注意:key区分大小写,命令不区分大小写

incr / decr使用场景 :

1. 把某件商品数量放 jedis.set("product", ""+100);

2. 秒杀购买这件商品 Long incr = jedis.decr("product"); 减1后, 然后获得产品余量>0代表还没售完;

然后把当前用户购买信息保存到购买成功列表中;

hash类型

Redis hash 是一个键值(key=>value)对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

添加数据hset person name jack (给key为person的hash中添加一个键值对,键为name值为jack)

hset person age 18 (给key为person的hash中添加一个键值对,键为age值为18)

hset person sex男 (给key为person的hash中添加一个键值对,键为sex值为男)

上面三个操作可以合并hmsetperson name jack age 18 sex男

删除数据hdel person name(删除hash中某一个键值对)

del person (删除整个hash)

修改数据hset person age 30 (覆盖原有的值)

查看数据hget person name(查看hash中某一个键值对)

hgetall person (查看hash中所有的数据)

hlen person(查看整个hash的长度)

自学:hincrby,hdecrby,hexsits,hkeys,hvals…

应用场景:1:hash特别适合用于存储对象,效率更高

2:当redis中key多了,为了很好的管理这些key,我们可以使用hash,比如当我们想缓存商品信息,那我们的key-value应该是:商品id为key:商品的json对象为值,但是商品多了key就多了,这时候我们可以将这些key-value放入hash中,再给hash取个大key比如叫product,所以我们存储的方式就如下:

List数据类型

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

1)常用命令:

两端添加lpush ages 12 13 18

rpush ages 1 2 3 4

两端弹出lpop ages(左边弹出,弹出的同时会删除弹出的数据)

rpop ages(右边弹出,弹出的同时会删除弹出的数据)

查看数据lrange ages 0 -1 (从左到右查看所有的元素)

llen ages (查看list的长度)

2)阻塞命令: 消息队列使用

blpop ages 100

移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时(100s)(0表示永远阻塞) 或发现可弹出元素为止

brpop ages 100

移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时(100s)或发现可弹出元素为止

消息队列实例

思路: 使用blpop命令永久堵塞, 移出并获取第一个元素

// 生产者 - 往list数据类型中放入key为product的数据public static void main(String[] args) {Jedis jedis = RedisUtil.getJedis();jedis.lpush("product", "11","12","13","14","15");RedisUtil.returnResource(jedis);}// 消费者 - 使用堵塞命令实时获取product的数据public static void main(String[] args) {while (true) {// 获取一个redis实例Jedis jedis = RedisUtil.getJedis();try {// 永久堵塞, 等待key为product的数据(从list左边开始逐一获取), 返回一条key和value数据List<String> result = jedis.brpop(0, "product");if (result != null && result.size() > 1) {String key = result.get(0); // productString value = result.get(1); // 逐一取出list中的value值System.out.println(key + " : " + value);}} catch (Exception e) {e.printStackTrace();} finally {// 释放redis实例RedisUtil.returnResource(jedis);}}}

3)自学命令:lpushx, rpushx,,lrem

lpishx :将一个值插入到已存在的列表头部(最左边),列表不存在时操作无效。

rpushx :将一个值插入到已存在的列表尾部(最右边)。列表不存在时操作无效。

lrem : 移除指定数量的value (可指定从左/右开始移除)。

应用场景:记录网站最近登陆用户

扩展1:模拟队列

扩展2:模拟栈

redis阻塞原理:redis在blpop命令处理过程时,首先会去查找key对应的list,如果存在,则pop出数据响应给客户端。否则将对应的key push到blocking_keys数据结构当中,对应的value是被阻塞的client。当下次push命令发出时,服务器检查blocking_keys当中是否存在对应的key,如果存在,则将key添加到ready_keys链表当中,同时将value插入链表当中并响应客户端。

Set数据类型

Redis的Set是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

添加数据sadd nums 1 2 3 3 4 5

删除数据srem nums 1 2

查看数据smembers nums(查看集合中所有的数据)

scard nums(查看集合长度)

自学:sismember, srandmemeber,sdiff,sinner,sunion

sismember :判断一个元素是否集合key的成员。

应用场景共同关注、共同喜好

zset数据类型

添加数据zadd pro 188袜子99书包22鞋子(注意:分数在前,元素内容在后)

查询数据

zscore pro鞋子 (查看鞋子分数)

zcard pro(查看集合长度)

zrange pro 0 -1 [withscores](查看集合所有内容,加withscores表示显示分数,不加withscores表示不显示分数)

删除数据zrem pro鞋子(删除鞋子)

代码示例

jedis.zadd("product_1", 200, "袜子");jedis.zadd("product_1", 180, "上衣");jedis.zadd("product_1", 190, "下衣");Set<String> zrange = jedis.zrange("product_1", 0, -1);for (String string : zrange) {System.out.println(string); }// 上衣 // 下衣 // 袜子

应用场景:销售排行耪

注意:为了不出现中文乱码 连接redis服务命令带上--raw 如:./redis-cli --raw 解决中文乱码

原创作者:全村的希望

如果觉得《redis 数据类型与使用场景》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。