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 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插入链表当中并响应客户端。


 

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 zrange = jedis.zrange("product_1", 0, -1);
for (String string : zrange) {
	System.out.println(string); 
}
// 上衣   
// 下衣   
// 袜子

应用场景:销售排行耪

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

 

原创  作者:全村的希望   www.wendaoxueyuan.com

你可能感兴趣的:(redis)