版本redis6.2.6
- redis算是使用最广泛的缓存了,截止目前,redis最新版本是6.2.6 。
- 学习redis最核心的是学习它的数据结构及一些特性。
- redis6的最大特性应该是增加了ACLS,也就是可以增加访问的用户名并设置权限了,有点像mysql数据库不光是root用户,还可以增加其它的用户及权限。
增加如下依赖:
前提:springboot项目已经创建好。
<dependency>
<groupId></groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId></groupId>
<artifactId>jedis</artifactId>
</dependency>
spring-data-redis当前最新版本是2.6.1
连接代码
public class RedisSample {
JedisPool pool = new JedisPool("19.45.25.63", 7379);
Jedis jedis =pool.getResource();
public RedisSample(){
jedis.auth("123123");
System.out.println("连接成功");
//查看服务是否运行
System.out.println("服务正在运行: "+jedis.ping());
}
public void testRedis(){
//该使用方法已经被遗弃了
//Jedis jedis = new Jedis("http://19.45.25.63:7379");
//清除当前数据库所有数据
jedis.flushDB();
//设置键值对
jedis.set("LOGIN_NAME","宇内大猫");
//查看存储的键的总数
System.out.println(jedis.dbSize());
//取出设置的键值对并打印
System.out.println(jedis.get("LOGIN_NAME"));
System.out.println(jedis.info());
}
}
之前的用法new Jedis已经不建议使用了:
Jedis jedis = new
Jedis(“http://19.45.25.63:7379”);
- 现在推荐使用JedisPool
- 获取到连接池后,就可以通过()进行连接
- 当然,如果设置了密码,就需要通过auth函数进行授权。
jedis的官方接口API,可点击查看
连接到Redis集群
连接到集群,需要用到JedisCluster和HashSet,代码示例:
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
nodes.add(new HostAndPort("127.0.0.1", 7379));
nodes.add(new HostAndPort("127.0.0.1", 7380));
JedisCluster jedis = new JedisCluster(nodes);
- HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
- HostAndPort是一个ip加端口的对象。
- 通过JedisCluster初始化连接。连接后即可进行数据操作:
jedis.sadd("planets", "Mars");
redis的5种数据结构
1、字符串String
- string类型是实战中应用最多的数据类型,Redis的一些特性决定了string类型的应用场景。
- 此类型和memcache相似,作为常规的key-value缓存应用。例如登录用户名、登录时间等。一个键最大能存储512MB
- 项目中经常把json转换成string存到value中。
常用的操作如下:
- set :设置键值对
- get :获取健对应的值
- pexpire :设置过期时间 ,expire方法已经不建议使用了。
- ttl :获取剩余的生存时间
- del :删除一个键值对
- exists :判断键值对是否存在
- mset : 设置多个键值对
- mget: 获取多个键对应的值
代码示例:
public void stringSample(){
jedis.set("LOGIN_NAME","宇内大猫");
jedis.set("SESSIONID","ADKFASDKFJAKSDFL");
jedis.set("LOGIN_TIME", new SimpleDateFormat().format(new Date()));
jedis.set("num","100");
//自增自减
System.out.println("num自增后:"+jedis.incr("num"));
System.out.println("num自减后:"+jedis.decr("num"));
//设置过期时间为5秒
jedis.expire("LOGIN_TIME",5);
System.out.println("LOGIN_TIME的值是:"+jedis.get("LOGIN_TIME"));
System.out.println("LOGIN_TIME剩余时间:"+jedis.ttl("LOGIN_TIME"));
System.out.println("LOGIN_TIME的类型:"+jedis.type("LOGIN_TIME"));
//设置过期时间为50毫秒
jedis.pexpire("LOGIN_TIME",50);
try{
Thread.sleep(50);
}catch (Exception e){
e.printStackTrace();
}
//查看剩余生存时间
System.out.println("LOGIN_TIME是否存在:"+jedis.exists("LOGIN_TIME"));
jedis.del("SESSIONID");
System.out.println("SESSIONID是否存在:"+jedis.exists("SESSIONID"));
//mset可以设置多个键值对 ,mget可以获取多个值,形成一个列表
jedis.mset("id1","zhangsan","id2","lisi","id3","wanger");
List mgetresult = jedis.mget("id1","id2","id3");
System.out.println(mgetresult);
}
运行结果:
num自增后:101
num自减后:100
LOGIN_TIME的值是:2022/2/7 下午10:46
LOGIN_TIME剩余时间:5
LOGIN_TIME的类型:string
LOGIN_TIME是否存在:false
SESSIONID是否存在:false
[zhangsan, lisi, wanger]
2、list
list列表是简单的字符串列表,按照插入顺序排序(内部实现为LinkedList),可以选择将一个元素插入到头部或尾部
常用命令 :
- lpush :添加左边元素
- rpush :添加右边元素
- lpop :弹出左边第一个元素
- rpop :弹出右边第一个元素
- lrange :获取列表片段
- lrem : 删除指定元素
- ltrim :保留指定范围的元素,其它的都删除
final static String FOCUS_USERS = "FOCUS_USERS";
public void listsample(){
jedis.flushDB();
jedis.lpush(FOCUS_USERS,"zhangshan","wanger");
jedis.lpush(FOCUS_USERS,"damao");
jedis.lpush(FOCUS_USERS,"java");
jedis.lpush(FOCUS_USERS,"python");
jedis.lpush(FOCUS_USERS,"python");
jedis.rpush(FOCUS_USERS,"right");//在列表的右边添加元素
System.out.println("FOCUS_USERS的长度是:"+jedis.llen(FOCUS_USERS));
System.out.println(jedis.lrange(FOCUS_USERS,0,-1));
// 删除列表指定的值 ,第二个参数为删除的个数(有重复时),后add进去的值先被删,类似于出栈
System.out.println("成功删除指定元素个数:"+jedis.lrem(FOCUS_USERS, 2, "python"));
System.out.println(jedis.lrange(FOCUS_USERS,0,-1));
// 删除区间以外的数据
System.out.println("删除下标0-1区间之外的元素:"+jedis.ltrim(FOCUS_USERS, 0, 1));
System.out.println("保留0和1后的数据是:"+jedis.lrange(FOCUS_USERS,0,-1));
}
应用场景:
Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。
3、set
- Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
- 在微博中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能。
final static String FOLLOW_USERS = "FOLLOW_USERS";
public void setsample(){
jedis.flushDB();
jedis.sadd(FOCUS_USERS,"damao");
jedis.sadd(FOCUS_USERS,"tu");
jedis.sadd(FOCUS_USERS,"jane");
jedis.sadd(FOCUS_USERS,"tom");
System.out.println("关注列表中所有的元素是:"+jedis.smembers(FOCUS_USERS));
//删除指定的元素
jedis.srem(FOCUS_USERS,"tu");
//查询元素是否存在set中
System.out.println("tu是否在关注列表中:"+jedis.sismember(FOCUS_USERS,"tu"));
//
jedis.sadd(FOLLOW_USERS,"damao");
jedis.sadd(FOLLOW_USERS,"tu");
jedis.sadd(FOLLOW_USERS,"jane");
jedis.sadd(FOLLOW_USERS,"xiaoming");
System.out.println("跟随列表中所有的元素是:"+jedis.smembers(FOLLOW_USERS));
//交集
System.out.println("交集:"+jedis.sinter(FOCUS_USERS,FOLLOW_USERS));
//并集
System.out.println("并集:"+jedis.sunion(FOCUS_USERS,FOLLOW_USERS));
//差集
System.out.println("差集:"+jedis.sdiff(FOCUS_USERS,FOLLOW_USERS));
}
输出如下:
关注列表中所有的元素是:[jane, damao, tom, tu]
tu是否在关注列表中:false
跟随列表中所有的元素是:[xiaoming, jane, damao, tu]
交集:[jane, damao]
并集:[tom, jane, damao, xiaoming, tu]
差集:[tom]
4、有序集合(sorted set)
- Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
- 有序集合的成员是唯一的,但分数(score)却可以重复。
public void sortedsetSample(){
jedis.flushDB();
jedis.zadd(FOCUS_USERS,7,"damao");
jedis.zadd(FOCUS_USERS,8,"tu");
jedis.zadd(FOCUS_USERS,9,"jane");
jedis.zadd(FOCUS_USERS,1,"tom");
System.out.println("关注列表:"+jedis.zrange(FOCUS_USERS,0,-1));
//删除指定的元素
jedis.zrem(FOCUS_USERS,"tu");
System.out.println("删除后,关注列表:"+jedis.zrange(FOCUS_USERS,0,-1));
//查询统计
System.out.println("统计集合中的元素中个数:"+jedis.zcard(FOCUS_USERS));
System.out.println("统计集合中权重某个范围内(1.0——5.0),元素的个数:"+jedis.zcount(FOCUS_USERS, 1.0, 5.0));
System.out.println("查看集合中元素的权重:"+jedis.zscore(FOCUS_USERS, "damao"));
System.out.println("查看下标1到2范围内的元素值:"+jedis.zrange(FOCUS_USERS, 1, 2));
}
运行后结果:
关注列表:[tom, damao, tu, jane]
删除后,关注列表:[tom, damao, jane]
统计集合中的元素中个数:3
统计集合中权重某个范围内(1.0——5.0),元素的个数:1
查看集合中元素的权重:7.0
查看下标1到2范围内的元素值:[damao, jane]
5、哈希Hash
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
代码示例如下:
运行后输出为:
SHOPPING_CART所有的元素为:[A001, U001, 10, 98]
删除和修改后所有的元素为:[A001, 11, 98]
判断user_id是否存在:false
获取field_id对应的值:A001
批量获取field_id和price对应的值:[A001, 98]
获取所有的key:[field_id, price, num]
获取所有的value:[A001, 11, 98]