Redis 数据类型

在Redis介绍中我们说明了,Redis是通过键值对的形式来存储数据的,他可以存储的数据类型如下
 String字符类型
 Hash散列类型
 List列表类型
 Set集合类型
 Sortedset有序集合类型


String字符类型

Jedis jedis = new Jedis();

1.set和get方法

jedis.set("hello", "world");
System.out.println(jedis.get("hello"));
jedis.rename("hello", "newhello");
System.out.println(jedis.get("newhello"));
jedis.setex("hello2", 1800, "world");

输出:这里写图片描述

2.缓存时间

//带缓存时间的set 1800秒
jedis.setex("hello2", 1800, "world");

实际应用:比如验证码,或者短信验证消息,将这些消息放在redis中,设置缓存时间,过了一段时间就自动消失了。

3.自增和自减

jedis.set("pv", "100");
jedis.incr("pv");               //自增1
jedis.incrBy("pv", 5);          //自增5
System.out.println(jedis.get("pv"));
jedis.decrBy("pv", 2);          //自减2
System.out.println(jedis.get("pv"));

输出:这里写图片描述
实际应用:比如数值型,变化特别大,比如秒杀,比如帖子的阅读数,一般都是放在内存之中,通常使用redis

4.输出所有的key

jedis.keys("*"))

List列表类型

Redis的Linkedlist是采用来链表来存储的,所以对于redis的list数据类型的操作,是操作list的两端数据来操作的。

Arraylist是使用数组来存储数据,特点:查询快、增删慢
Linkedlist是使用双向链表存储数据,特点:增删快、查询慢,但是查询链表两端的数据也很快。

Jedis jedis = new Jedis();
jedis.flushDB();

String listName = "list";
//往list中加数据
for (int i = 0; i < 10; ++i) {
     jedis.lpush(listName, "a" + i);
}
//往list中取下标0到12的数据
System.out.println(jedis.lrange(listName, 0, 12));
//往list中取下标0到3的数据
System.out.println(jedis.lrange(listName, 0, 3));

输出结果:这里写图片描述

//输出List长度
System.out.println(jedis.llen(listName));
//弹出最外的数据,就像栈一样
System.out.println(jedis.lpop(listName));
System.out.println(jedis.llen(listName));
System.out.println(jedis.lrange(listName, 2, 6));
//输出下标为3的数据
System.out.println(jedis.lindex(listName, 3));

输出:这里写图片描述

//linsert如果命令执行成功,返回插入操作完成之后,列表的长度。
//在a4后面插入xx
System.out.println(jedis.linsert(listName,BinaryClient.LIST_POSITION.AFTER, "a4", "xx"));
//在a4前面插入bb
System.out.println(jedis.linsert(listName,BinaryClient.LIST_POSITION.BEFORE, "a4", "bb"));
System.out.println(jedis.lrange(listName, 0 ,12));

输出:这里写图片描述

应用:商品评论列表
思路:
在Redis中创建商品评论列表
用户发布商品评论,将评论信息转成json存储到list中。
用户在页面查询评论列表,从redis中取出json数据展示到页面。


Hash散列类型

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
redis可以任意给对象添加属性,比如user对象,是否为付费用户,如果用关系型数据库的话就要给所有user添加一个属性,但是大部分用户为非付费用户,根本就没有这个数据,随着数据量的增大,就很麻烦。但是redis就可以随意添加属性,所以redis的hash类型适合用来存储不定向的属性值。
1.set和get

String userKey = "userxx";
jedis.hset(userKey, "name", "jim");
jedis.hset(userKey, "age", "12");
jedis.hset(userKey, "phone", "18618181818");
System.out.println(jedis.hget(userKey, "name"));
System.out.println(jedis.hgetAll(userKey));

输出:
这里写图片描述

2.删除属性

jedis.hdel(userKey, "phone");
System.out.println(jedis.hgetAll(userKey));

输出:这里写图片描述

3.判断属性是否存在

System.out.println(jedis.hexists(userKey, "email"));
System.out.println(jedis.hexists(userKey, "age"));

输出:这里写图片描述

4.输出所有的keys 和 values

System.out.println(jedis.hkeys(userKey));
System.out.println(jedis.hvals(userKey));

输出:
这里写图片描述

5.如果不存在该属性,就set进去

jedis.hsetnx(userKey, "school", "hust");
jedis.hsetnx(userKey, "name", "zfj");
System.out.println(jedis.hgetAll(userKey));

输出:
这里写图片描述
name已经存在所以没有被set进去,school不存在就set进去了。


Set集合类型

集合类型:无序、不可重复
列表类型:有序、可重复

比如点赞功能,就不能放在List中,因为同一个人不能对同一个帖子点两次赞。这时候就要用到Set集合,因为set集合带有去重的效果。
还有已读,共同好友,抽奖等

1.add和members

String likeKey1 = "commentLike1";
String likeKey2 = "commentLike2";
for (int i = 0; i < 10; ++i) {
    jedis.sadd(likeKey1, String.valueOf(i));
    jedis.sadd(likeKey2, String.valueOf(i * i));
}
System.out.println(jedis.smembers(likeKey1));
System.out.println(jedis.smembers(likeKey2));

输出:
这里写图片描述

2.交集并集
比如,微博中的共同关注的人,就用到了交集

//并集
System.out.println(jedis.sunion(likeKey1, likeKey2));
//likeKey1中有,likeKey2中没有的
System.out.println(jedis.sdiff(likeKey1, likeKey2));
//交集
System.out.println(jedis.sinter(likeKey1, likeKey2));

输出:
这里写图片描述

3.判断存在

System.out.println(jedis.sismember(likeKey1, "12"));
System.out.println(jedis.sismember(likeKey2, "16"));

输出:
这里写图片描述

4.删除和移动

//删除likeKey1中的5
jedis.srem(likeKey1, "5");
System.out.println(jedis.smembers(likeKey1));
//将likeKey2中的25移动到likeKey1中
jedis.smove(likeKey2, likeKey1, "25");
System.out.println(jedis.smembers(likeKey1));
System.out.println(jedis.smembers(likeKey2));

输出:
这里写图片描述

5.集合中一共有多少元素

System.out.println(jedis.scard(likeKey1));

输出:10


Sortedset有序集合类型

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
Sortedset又叫zset,适合应用在排序,排行榜等功能上
Sortedset是有序集合,可排序的,但是唯一。
Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序。

适用于排行榜,优先队列等

1.add和get

String rankKey = "rankKey";
jedis.zadd(rankKey, 15, "jim");
jedis.zadd(rankKey, 60, "Ben");
jedis.zadd(rankKey, 90, "Lee");
jedis.zadd(rankKey, 75, "Lucy");
jedis.zadd(rankKey, 80, "Mei");
//集合中的对象个数
System.out.println(jedis.zcard(rankKey));
//61-100分的对象个数
System.out.println(jedis.zcount(rankKey, 61, 100));
//Lucy的分数
System.out.println(jedis.zscore(rankKey, "Lucy"));
//lucy分数加2
jedis.zincrby(rankKey, 2, "Lucy");
System.out.println(jedis.zscore(rankKey, "Lucy"));

输出:
这里写图片描述

2.排序功能

System.out.println(jedis.zrange(rankKey, 0, 100));
//输出分值的前三名,默认按低分值排序
System.out.println(jedis.zrange(rankKey, 0, 2));
//输出分值的前三名,按高分值排序
System.out.println(jedis.zrevrange(rankKey, 0, 2));

输出:
这里写图片描述

打印60-100分数的成员,并排序

for (Tuple tuple : jedis.zrangeByScoreWithScores(rankKey, "60", "100")) {
     System.out.println(tuple.getElement() + ":" + tuple.getScore());
}

输出:
这里写图片描述

3.获取排名

//获取Ben的排名
System.out.println(jedis.zrank(rankKey, "Ben"));
System.out.println(jedis.zrevrank(rankKey, "Ben"));

输出:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值