JAVA中redis相关 |
您所在的位置:网站首页 › java配置redis › JAVA中redis相关 |
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 |