栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

2-springboot使用redis

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2-springboot使用redis

版本redis6.2.6

截止目前,redis最新版本是6.2.6 。redis6的最大特性应该是增加了ACLS,也就是可以增加访问的用户名并设置权限了,有点像mysql数据库不光是root用户,还可以增加其它的用户及权限。

pom.xml增加如下依赖:

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

    
      org.springframework.data
      spring-data-redis
      2.6.1
    

    
      redis.clients
      jedis
    

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 nodes = new HashSet();
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 特别适合用于存储对象。
代码示例如下:

final static String SHOPPING_CART = "SHOPPING_CART";
public void hashSample(){
    jedis.flushDB();
    //新增
    jedis.hset(SHOPPING_CART,"field_id","A001");
    jedis.hset(SHOPPING_CART,"user_id","U001");
    jedis.hincrBy(SHOPPING_CART,"num",10);
    jedis.hincrBy(SHOPPING_CART,"price",98);
    System.out.println("SHOPPING_CART所有的元素为:"+jedis.hvals(SHOPPING_CART));
    //修改
    jedis.hset(SHOPPING_CART,"user_id","U002");
    //num增加1
    jedis.hincrBy(SHOPPING_CART,"num",1);
    jedis.hdel(SHOPPING_CART,"user_id");
    System.out.println("删除和修改后所有的元素为:"+jedis.hvals(SHOPPING_CART));
    //查询
    System.out.println("判断user_id是否存在:"+jedis.hexists(SHOPPING_CART, "user_id"));
    System.out.println("获取field_id对应的值:"+jedis.hget(SHOPPING_CART, "field_id"));
    System.out.println("批量获取field_id和price对应的值:"+jedis.hmget(SHOPPING_CART, "field_id", "price"));
    System.out.println("获取所有的key:"+jedis.hkeys(SHOPPING_CART));
    System.out.println("获取所有的value:"+jedis.hvals(SHOPPING_CART));
}

运行后输出为:

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]

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/731699.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号