工程目录//pom.xmlredis.clientsjedis2.9.0junitjunit4.12org.projectlomboklombok1.18.10提供com.alibabafastjson1.2.47org.springframeworkspring-context5.1.10.RELEASEorg.springframeworkspring-webmvc5.1.10.RELEASEcom.fasterxml.jackson.corejackson-databind<版本>2.10.2javax.servletjavax.servlet-api3.1.0提供//User.java@Data@AllArgsConstructor@NoArgsConstructorpublicclassUserimplementsSerializable{privateStringusername;privateStringpassword;}基本用法@Testpublicvoidt1(){Jedisjedis=newJedis("10.36.144.110",6379);Stringset=jedis.set("名字","zs");//“确定”System.out.println(set);Longlpush=jedis.lpush("列表","a","b","c");//1System.out.println(lpush);//在设置值的同时指定生存时间Stringsetex=jedis.setex("sex",100,"female");//“确定”System.out.println(setex);jedis.close();}@Testpublicvoidt2(){Jedisjedis=newJedis("10.36.144.110",6379);Stringresult=jedis.get("名字");//zsSystem.out.println(result);Listlist=jedis.lrange("list",0,-1);for(Strings:list){//cbaSystem.out.println(s);}//23System.out.println(jedis.ttl("sex"));jedis.close();}连接池的使用@Testpublicvoidt3(){//数据库连接池配置JedisPoolConfigconfig=newJedisP工具配置();//空闲数config.setMaxIdle(10);配置.setMinIdle(5);//最大连接数config.setMaxTotal(20);//超时时间config.setMaxWaitMillis(3000);//数据库连接池JedisPooljedisPool=newJedisPool(config,"10.36.144.110",6379);绝地武士jedis=jedisPool.getResource();Stringage=jedis.set("age","13");//“确定”System.out.println(age);//关闭的数据库会进入回收池jedis.close();}提取公共类封装set和get方法,序列化对象//RedisUtil.javapublicclassRedisUtil{privatestaticJedisPoolpool;static{JedisPoolConfigconfig=newJedisPoolConfig();配置.setMaxIdle(10);配置.setMinIdle(5);配置.setMaxTotal(20);config.setMaxWaitMillis(3000);pool=newJedisPool(config,"10.36.144.110",6379);}publicstaticJedisgetJedis(){returnpool.getResource();}publicstaticvoidclose(Jedisjedis){jedis.close();}publicstaticStringset(Stringkey,Stringvalue){Jedisjedis=getJedis();字符串结果=jedis.set(key,value);关闭(绝地武士);返回结果;}publicstaticStringget(Stringkey){Jedisjedis=getJedis();字符串结果=jedis.get(key);关闭(绝地武士);returnresult;}//存储对象publicstaticStringset(Stringkey,Objectvalue){Jedisjedis=getJedis();//对象转stringStrings=JSON.toJSONString(value);字符串结果=jedis.set(key,s);关闭(绝地武士);returnresult;}//取对象值并转为对象publicstaticTget(Stringkey,ClasstClass){Jedisjedis=getJedis();字符串结果=jedis.get(key);关闭(绝地武士);Tt=JSON.parseObject(结果,tClass);returnt;}}公共类的使用@Testpublicvoidt4(){Stringres1=RedisUtil.set("width","100");System.out.println(res1);用户user=newUser("zs","123");Stringres2=RedisUtil.set("用户",用户);System.out.println(res2);}@Testpublicvoidt5(){Stringresult=RedisUtil.get("width");System.out.println(结果);用户user=RedisUtil.get("用户",User.class);System.out.println(user);}以byte[]形式获取对象@Testpublicvoidt6(){Jedisjedis=RedisUtil.getJedis();jedis.auth("123");用户user=newUser("ls","234");//序列化byte[]serialize=SerializationUtils.serialize(user);Stringres=jedis.set("user2".getBytes(),序列化);System.out.println(res);jedis.close();}@Testpublicvoidt7(){Jedisjedis=RedisUtil.getJedis();jedis.auth("123");byte[]bytes=jedis.get("user2".getBytes());//反序列化用户user=(User)SerializationUtils.deserialize(bytes);System.out.println(用户);jedis.close();}Redis的管道操作主要是解决频繁请求服务器带来的延迟问题。通过Redispipeline,先把command放到client的一个Pipeline中,然后一次性把所有的command发送给Redis。服务,Redis服务将所有的返回结果一次性响应给客户端。@Testpublicvoidt8(){Jedisjedis=RedisUtil.getJedis();//longstart=System.currentTimeMillis();////for(inti=0;i<10000;i++){//jedis.incr("zan");//}////longend=System.currentTimeMillis();//////12865//System.out.println(end-start);流水线pipelined=jedis.pipelined();长启动=System.currentTimeMillis();对于(inti=0;i<10000;i++){pipelined.incr("zan");}pipelined.syncAndReturnAll();longend=System.currentTimeMillis();//324System.out.println(end-start);}Redis应用模拟nginx连接多个tomcat服务器。当一台服务器登录时,其他服务器使用cookie来识别它是否已经登录。//const.javapublicinterfaceConst{//30minutesintLIVETIME=60*30;//登录状态标识StringISLOGIN="islogin";}//RedisUtil.java//用于保存用户的登录状态==>是时间限制publicstaticStringsetex(Stringkey,inttime,Objectvalue){Jedisjedis=getResoucres();//将对象序列化为JSON字符串Stringstring=JSON.toJSONString(value);//操作Stringresult=jedis.setex(key,time,string);关闭(绝地武士);returnresult;}//重置值生存时间publicstaticLongexpire(Stringkey,inttime){Jedisjedis=getResoucres();//再次操作设置值liveLongresult=jedis.expire(key,time);关闭(绝地武士);返回结果;}//UserController.java@RestController@RequestMapping("/user")publicclassUserController{@RequestMapping("/login")publicStringlogin(Stringusername,Stringpassword,HttpServletResponseresponse){if(username.equals("admin")&&password.equals("admin")){Useru=newUser("admin","admin");字符串uuid=UUID.randomUUID().toString();//保存号码根据redis作为登录状态//使用uuid作为redis保存的key值,为了防止key重复覆盖RedisUtil.setex(uuid,Const.LIVETIME,u);//将uuid的值保存在cookie中,以便其他服务器获取uuid来验证登录状态//创建cookie对象Cookiecookie=newCookie(Const.ISLOGIN,uuid);//设置cookie的存活时间cookie.setMaxAge(Const.LIVETIME);//设置范围cookie.setPath("/");//使用response向客户端写入cookieresponse.addCookie(cookie);返回“确定”;}return"no";}@RequestMapping("/check")publicStringcheckLogin(@CookieValue(Const.ISLOGIN)Stringuuid){/*Cookie[]cookies=request.getCookies();字符串uuid=空;for(Cookiecookie:cookies){if(cookie.getName().equals(Const.ISLOGIN)){uuid=cookie.getValue();}}*///cookie是否有uuidif(uuid!=null){Useruser=RedisUtil.get(uuid,User.class);if(user!=null){System.out.println(user);返回“正在登录”;}}返回”isnotlogin";}}Redis其他配置docker-compose.yml映射redis配置文件version:'3.1'services:nginx:restart:alwaysimage:daocloud.io/library/nginx:latestcontainer_name:nginxports:-80:80redis:image:daocloud.io/library/redis:5.0.7restart:alwayscontainer_name:redisenvironment:-TZ=Asia/Shanghaiports:-6379:6379volumes:-/opt/docker_nginx/conf.d/:/etc/nginx/conf.d-/opt/docker_nginx/img/:/data/img-/opt/docker_nginx/html/:/data/html-/opt/docker_nginx/conf/redis.conf:/usr/local/redis/redis.confcommand:["redis-server","/usr/local/redis/redis.conf"]//关闭dockerdocker-composedown//创建文件夹mkdirconf//自己创建一个redis.conf文件,否则打开docker自动创建文件夹viconf/redis.conf//opendockerdocker-composeup-dauthenticationrequirepassadminrdbdbfilenameredis.rdbsave9001sava30010save6010000aofappendonlyyesappendfilename"redis.aof"appendfsynceverysec认证连接redis-cli,命令authadmin。图形界面,连接时添加密码。java,代码jedis.auth(admin);Redis数据持久化机制。RDB是Redis默认的持久化机制。Java训练RDB不能保证数据的绝对安全。save9001、900秒内,如果某个key发生变化,则执行RDB持久化。save30010,300秒内,如果有10个key发生变化,则执行RDB持久化。save6010000,60秒内,如果有10000个key发生变化,则执行RDB持久化。AOF持久化机制默认是关闭的。Redis官方推荐同时开启RDB和AOF持久化,更安全,避免数据丢失。AOF持久化的速度比RDB慢。它存储一个文本文件,记录每个数据库操作命令。后期文件会比较大,传输困难。appendfsyncalways,每执行一次写操作,就立即持久化到AOF文件中,性能比较低。appendfsynceverysec,每秒执行一次持久化。appendfsync没有,根据操作系统和环境的不同,会在一定时间内执行一次持久化。原作者:李勋