2-springboot使用redis

版本redis6.2.6

  • redis算是使用最广泛的缓存了,截止目前,redis最新版本是6.2.6 。
  • 学习redis最核心的是学习它的数据结构及一些特性。
  • redis6的最大特性应该是增加了ACLS,也就是可以增加访问的用户名并设置权限了,有点像mysql数据库不光是root用户,还可以增加其它的用户及权限。

pom.xml增加如下依赖:

前提:springboot项目已经创建好。

    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>2.6.1</version>
    </dependency>

    <dependency>
      <groupId>redis.clients</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
  • 获取到连接池后,就可以通过pool.getResource()进行连接
  • 当然,如果设置了密码,就需要通过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]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值