在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"));
输出: