redis 数据类型与使用场景
redis5种数据类型概览
数据类型 |
key类型 |
value类型 | 特点 |
string | string | string | 无 |
Hash | string | 类似于java的map集合 | value的key不能重复 |
List | string | string类型的双向链表 |
list可以当做栈或队 列,有序可重复 |
Set | string |
类似于java中的hashset 只不过set集合中放的都是字符串 |
无序,不可重复 |
zset | string | 分数和数据 | 有序,不可重复 |
常用key命令
KEYS * :可以浏览所有存储在内存中的key |
EXPIRE key seconds:给指定的key设置过期时间,超过时间该key就会从内存中删除 |
TTL key:返回指定的key的所剩的生命时间 -1代表不会过期 -2代表key已经不存在 |
PERSIST key:移除过期时间 |
Del key 删除key |
Rename key newkey 重命名 |
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值为男)
上面三个操作可以合并 hmset person 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,所以我们存储的方式就如下:
product | 001:{"name":"鞋子"} |
002:{"name":"袜子"} | |
003:{"name":"电脑"} |
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:模拟队列
模拟队列 | 先进先出 |
从左边存从右边取 |
lpush ages 10 12 16 rpop ages |
从右边存从左边取 | rpush ages 18 12 19 lpop ages |
扩展2:模拟栈
模拟栈 | 先进后出 |
从左边存从左边取 |
lpush ages 10 20 18 lpop ages |
从右边存从右边取 | rpush ages 18 20 19 rpop ages |
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 解决中文乱码
原创 作者:全村的希望 www.wendaoxueyuan.com
redis 数据类型与使用场景相关推荐
- Redis 数据类型及应用场景
一. redis 特点 所有数据存储在内存中,高速读写 提供丰富多样的数据类型:string. hash. set. sorted set.bitmap.hyperloglog 提供了 AOF 和 R ...
- 超强Redis数据类型与应用场景总结!!
关于Redis 我们先来聊聊Redis的基础知识. 基于键值对的存储系统 :字典形式. 五种数据结构:字符串(String),Hash(字典),列表(List),集合(Set),有序集合(Sorted ...
- redis数据类型、应用场景、常用命令
redis的5种存储类型:string,hash,list,set,sorted set 两种持久化方式:RDB(默认方式,指定时间间隔内,执行指定的次数的写操作):AOF(默认每秒将写操作追加到AO ...
- 【Redis】redis数据类型及应用场景
✔ String 此类型和 memcache 相似,作为常规的 key-value 缓存应用 应用场景: ○ 例如微博数.粉丝数等. ✔ Hash redis hash是一个 string 类型的 f ...
- 2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景
作者:小林coding 计算机八股文网(操作系统.计算机网络.计算机组成.MySQL.Redis):https://xiaolincoding.com 大家好,我是小林. 我们都知道 Redis 提供 ...
- Redis的数据类型以及每种数据类型的使用场景
人就是很奇怪的动物,很简单的问题往往大家都容易忽略,当我们在使用分布式缓存Redis的时候,一个最简单的问题往往被人忽略,Redis的数据类型以及每种数据类型的使用场景是什么? 是不是觉得这个问题很基 ...
- Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存击穿,缓存穿透
Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存击穿,缓存穿透 简单介绍一个redis? redis是内存中的数据结构存储系统,一个key-value类型的非关系型数据库,可持久化的数据库 ...
- Redis五种数据类型及应用场景
Redis五种数据类型及应用场景 MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样 ...
- Redis数据类型使用场景及有序集合SortedSet底层实现详解
Redis常用数据类型有字符串String.字典dict.列表List.集合Set.有序集合SortedSet,本文将简单介绍各数据类型及其使用场景,并重点剖析有序集合SortedSet的实现. Li ...
最新文章
- Python eval函数用法简介
- Java防止Xss注入json_浅谈 React 中的 XSS 攻击
- 使用Zookeeper共享锁和排它锁和分布式队列的原理和实现(ZkClient)
- 新股上市涨跌幅规则?
- abb变频器正反转切换参数_变频器自动节能功能与电动机正反转图解
- 888. 公平的糖果棒交换
- 采用CPLD或者FPGA显示TFT液晶屏
- LIN、K、CAN、CAN-FD、FlexRay、Ethernet 、MOST、VAN常见汽车总线简介
- 【BZOJ4453】cys就是要拿英魂! 后缀数组+单调栈+set
- 用Changedetection监控网页的变化
- horner算法matlab实现,使用Euclid和Horner算法的多项式求值
- 203.为用户定义的数据类型绑定默认值案例
- java面试题大合集
- Android+Blockly大作业(含登录注册系统、碎片式浏览、Blockly设计)
- [置顶]生鲜配送管理系统_升鲜宝V2.0 销售订单汇总_采购任务分配功能_操作说明...
- wps.wrod.excel基本操作总结
- Python 网络编程之网络协议(未完待续)
- 【Flink异常】Caused by: java.lang.RuntimeException: Row arity of from does not match serializers
- 云时通 X 九毛九 | SRM系统助力连锁餐饮行业高效管理供应链
- stc15f2k60f2单片机定时器_STC15F2系列单片机UART1使用定时器1做波特率发生器