JAVA中redis相关

您所在的位置:网站首页 java配置redis JAVA中redis相关

JAVA中redis相关

#JAVA中redis相关| 来源: 网络整理| 查看: 265

JAVA中redis相关 [redis是什么] redis 是一个高性能的开源的、C语言写的Nosql(非关系型数据库),数据保存在内存中(快,容易丢失)。与mysql不一样的是,redis的数据是存储在内存中,因此它的读写十分快,据说1秒能能进行10完次读写. [redis的使用场景] 存入对象json计数器(访问人数,点赞分享,分布式自增ID)分布式锁短网址生成器用户登录会话存储存储对象(缓存)随机点名点击量最大的前10七日搜索榜单等等 [在linux中安装redis] 1.下载redis源码 wget http://download.redis.io/releases/redis-6.0.5.tar.gz 2.安装redis tar zxf redis-6.0.5.tar.gz //解压 注意:新版的redis需要较高版本的gcc,所以需要安装或升级ggc的版本(如果已是最新版本,可以跳过此3-5步骤) 3.安装gcc yum -y install gcc 4.升级gcc 4.1安装centos-release-scl yum install centos-release-scl 4.2安装 devtoolset yum install devtoolset-9-gcc* 4.3激活 scl enable devtoolset-9 bash 5.查看gcc版本 gcc -v 6.编译redis cd redis-6.0.5 make 7.测试启动 cd src ./redis-server 8.测试连接 ./redis-cli -h ip -p 端口 [linux下redis的环境配置] 1.在redis的根目录下创建config文件 mkdir config 2.把配置文件内容负责到config文件夹中并过滤注释 cat redis.conf | grep -v "#" | grep -v "^$" >> config/redis.conf 3.修改config中redis.conf配置文件 vi redis.conf bind 改为0.0.0.0 //放开端口 daemonize 改为yes //后台运行 logfile 改为"ewdis.log" //运行时生产日志文件 4.启动ridis ./redis-server ../config/redis.conf [常用的redis类型] [String:“字符串”] 设置一个: set key value(如果key存在则覆盖,不存在着新增) 设置多个: mset key value [key value *****](如果key存在则覆盖,不存在着新增) 设置多个不覆盖重复的数据: msetnx key value [key value *****](全部设置成功返回1,有一个或多个设置失败返回0) 查询一个value: get key 查询多个value: mget key [key ****] 设置一个key并返回之前的value: getset key value 对value为数值的key进行操作 对value的数值减1: decr key 对value的数值减去对应数值: decrby key decrement 对value的数值加1: incr key 对value的数值加对应数值: incrby key decrement [hash:“hashMap”]

hash用于存储多个键值对,一个存储空间可以存储多个数据,一般可以使用hash来存储对象信息。

注意:hash类型设计之初就不是为了存储大量对象使用的,不要将其视为专门用于存储对象使用的数据类型。

设置单个或多个 hset key field value [field value ...] 获取某个key的所有属性 hegtall key 获取单个属性的value hget key field 查询某key下多个或单个value hmget key field [field ...] 删除某key下多个或单个属性 hdel key field [field ...] 查询某key下有多少个属性 hlen key 查询某个key下是否存在某个属性 hexists key field 对属性为数值进行查询 对整数进行操作: hincrby key field increment(increment是要增加或者减少的整数,值为正,做增加,值为负,做减少) 对整数进行操作: hincrbyfloat key field increment(increment是要增加或者减少的浮点数,值为正,做增加,值为负,做减少) [list:“List”]

list其实就是类似于java中的list集合(LinkedList),用于存储多个数据。底层使用的是双向链表,对于list来说,着重考虑的是数据进行存储空间和从存储空间中取出数据的顺序。

从左边存入单个或多个数据 lpush key element [element ...] 从右边存入单个或多个数据 rpush key element [element ...] 获取单个数据 lindex key index(index为下标) 获取多个数据 lrange key start stop(start:起始下标,stop:结束下标) 从左边删除第一个数据,并获取它 lpop key 从右边删除第一个数据,并获取它 rpop key 从左向右,删除list中的指定数据 lrem key count value(count:要删除几个,value:要删除的值) [set:“HashSet”]

set也是用于存储多个数据的。

list和set的区别:

list底层是双向链表,set的底层为hash,查询效率上来说,set优于list;

list是有序的,set是无序的;

list中元素是可重复出现的,set元素不允许重复;

添加一个或多个元素到集合 sadd key member [member ...] 获取集合里面的元素数量 scard key 获取集合里面的所有元素 smembers key 删除并获取集合里面的元素 spop key [count] 查看集合中是否存在某个元素: sismember key member 随机获取set中的多个或单个元素 srandmember key [count] 随机删除并获取一个或多个元素 spop key [count] [zset(sorted set):“TreeSet”]

zset是基于set的实现,在set的基础上增加了score(分值)属性用于进行排序。

添加到有序集合的一个成员或多个成员,如果存在则更新分数 zadd key score member [score member ...] 查询,按分数升序排序 zrange key start stop [withscores] 查询,按分数降序排序 zrevrange key start stop [withscores] 查询score的值在某个范围内的元素,分数升序 zrangebyscore key min max [withscores] [limit offset count] (min:要查询的最小分值,max:要查询的最大分值,offset:从哪个下标开始,count:要查询几个元素) 查询score的值在某个范围内的元素,分数降序 zrevrangebyscore key max min [withscores] [limit offset count] 在集合里删除一个或多个成员 zrem key member [member ...] 删除某区间的分值的成员 zremrangebyscore key min max 按索引进行删除 zremrangebyrank key start stop 统计集合中成员的个数 zcard key 统计指定score分值区间内的成员个数 zcount key min max [对key的操作] 删除多个或单个key del key [key ....] 设置一个对key的过期时间 expire key seconds 查询所有匹配的key keys pattern 获取key的过期时间 ttl key 获取key的类型 type key

更多命令可以查看:redis.cn或redis.io

[java应用连接redis] [spring-data-redis]

可以使用jedis或者是boot项目中可以使用spring-data-redis.

boot项目中使用spring-data-redis的步骤:

引入相关依赖(spring-boot-starter-data-redis)

org.springframework.boot spring-boot-starter-data-redis

在application.yml配置redis的ip和端口

spring: redis: host: 192.168.147.130 port: 6379

在业务层中装配Redistemplate

//泛型: //1.是key的数据类型 //2.是value的数据类型 @Resource private RedisTemplate redisTemplate;

在业务方法中通过Redistemplate对象,去获取操作指定数据类型的operation对象

//1.通过redistemplate对象去获取操作redis的相应接口对象(ListOperations) //redistemplate有相关的api专门用于获取操作某种数据类型的对象 ListOperations listOperations = redisTemplate.opsForList();

通过operation对象支调用相关的api完成对redis的增删改查

//假设redis中保存了热点数据, 是一个list,key是users //查询 List users = listOperations.range("users", 0, -1); //新增 listOperations.leftPushAll("users",list);//将热点数据保存到redis中

设置key的有效时间(可选)

//参数1是key,参数2是过期时间数值,参数3是过期时间单位 redisTemplate.expire("users",50L,TimeUnit.SECONDS) [Redisson]

添加依赖

org.redisson redisson-spring-boot-starter 3.19.1

添加配置

#Redisson添加配置的内容和spring-data-redis是一样的 spring: redis: host: localhost port: 6379

在业务层中装配RedissonClient

@Resource private RedissonClient redisson;

分布式对象

对redis的key进行操作

//获取RKeys对象 RKeys keys = redisson.getKeys(); //获取所有key Iterable allKeys = keys.getKeys(); //获取所有匹配的key Iterable foundedKeys = keys.getKeysByPattern('key*'); //删除多个或单个key long numOfDeletedKeys = keys.delete("obj1", "obj2", "obj3",.....); //删除所有配的key long deletedKeysAmount = keys.deleteByPattern("test?"); //统计所有key的数量 long keysAmount = keys.count();

通用对象桶

通用对象桶可以放任何类型的对象

//创建RBucket对象 RBucket bucket = redisson.getBucket("anyObject"); //添加一个对象 bucket.set(new AnyObject(1)); //获取对象 AnyObject obj = bucket.get(); //匹配替换(bucket中的对象匹配第一个对象就会被第换成第二个对象) bucket.compareAndSet(new AnyObject(4), new AnyObject(5)); //修改为新的对象并返回久对象 bucket.getAndSet(new AnyObject(6));

布隆过滤器

//创建RBloomFilter对象 RBloomFilter bloomFilter = redisson.getBloomFilter("sample"); // 初始化布隆过滤器,预计统计元素数量为55000000,期望误差率为0.03 bloomFilter.tryInit(55000000L, 0.03); //新增 bloomFilter.add(new SomeObject("field1Value", "field2Value")); bloomFilter.add(new SomeObject("field5Value", "field8Value")); //判断该对象是否在redis中 bloomFilter.contains(new SomeObject("field1Value", "field8Value"));

分布式锁

可重入锁

@Resource private RedissonClient redissonClient; @PostMapping("/test1") @ApiOperation("测试1") public Result test1(Integer userId){ //创建锁对象 RLock lock = redissonClient.getLock("sava:test1" + userId); log.info("test1准备获取锁"); try { //获取锁 lock.lock(); log.info("test1获取了锁"); //睡眠10秒 Thread.sleep(1000*10); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { //解开锁 lock.unlock(); log.info("test1解开了锁"); } return Result.success(200,"成功",null); } @PostMapping("/test2") @ApiOperation("测试2") public Result wangwu(Integer userId){ RLock lock = redissonClient.getLock("sava:test2" + userId); log.info("test2准备获取锁"); try { lock.lock(); log.info("test2获取了锁"); Thread.sleep(1000*10); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { lock.unlock(); log.info("test2解开了锁"); } return Result.success(200,"成功",null); } //先访问test1 //在访问test2 [Spring-Cache]

SpringCache是Spring提供的一个缓存框架.

Spring-Cache的使用

引入依赖

org.springframework.boot spring-boot-starter-cache

增加配置

spring: cache: type: redis redis: time-to-live: 60S //表示缓存60秒

在启动类中添加@EnableCaching配置

@SpringBootApplication @EnableCaching public class RedisTestApplication { public static void main(String[] args) { SpringApplication.run(RedisTestApplication.class, args); } }

在业务实现类添加@Cacheable(cacheNames = “”,key = “#…”)

//缓存时有返回值作为缓存 //添加配置后,假如传入的userId为2,redis中的key名称为 user:userId::2 @Cacheable(cacheNames = "user:userId",key = "#userId") public User findById(int userId){ return getById(userId); }

修改数据库后同时修改缓存内容

@CachePut(cacheNames = "user:userId",key = "#user.userId") public User modify(User user){ updateById(user); return user; }

删除用户时,同时删除缓存

@CacheEvict(cacheNames = "user:userId",key = "#userId") public void delUser(int userId){ removeById(user); } [redisson的sprign-cache]

由于sprign-cache时通过配置设置的缓存过期的时间,所以整个项目的缓存都会时同一个过期时间.

redisson为我们整合了sprign-cache,我们只需要添加一个配置类久可以为不同的缓存设置存储时间.

@Configuration @ComponentScan @EnableCaching public static class Application { @Bean CacheManager cacheManager(RedissonClient redissonClient) { Map config = new HashMap(); // 创建一个名称为"user:userId的缓存,过期时间ttl为24分钟,同时最长空闲时maxIdleTime为12分钟。 config.put("user:userId", new CacheConfig(24*60*1000, 12*60*1000)); // 创建一个名称为"user:name"的缓存,过期时间ttl为1分钟,同时最长空闲时maxIdleTime为1分钟。 config.put("user:name", new CacheConfig(60*1000, 60*1000)); return new RedissonSpringCacheManager(redissonClient, config); } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3