数据类型 | key类型 | value类型 | 特点 |
string | string | string | 无 |
Hash | string | 类似于java的map集合 | value的key不能重复 |
List | string | string类型的双向链表 | list可以当做栈或队 列,有序可重复 |
Set | string | 类似于java中的hashset 只不过set集合中放的都是字符串 | 无序,不可重复 |
zset | string | 分数和数据 | 有序,不可重复 |
KEYS * :可以浏览所有存储在内存中的key |
EXPIRE key seconds:给指定的key设置过期时间,超过时间该key就会从内存中删除 |
TTL key:返回指定的key的所剩的生命时间 -1代表不会过期 -2代表key已经不存在 |
PERSIST key:移除过期时间 |
Del key 删除key |
Rename key newkey 重命名 |
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代表还没售完;
然后把当前用户购买信息保存到购买成功列表中;
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":"电脑"} |
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); // product
String 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插入链表当中并响应客户端。
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
的成员。
应用场景 共同关注、共同喜好
添加数据 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 解决中文乱码