<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Redis on Java 技术探秘</title>
    <link>https://www.szlinkroutes.com/tags/redis/</link>
    <description>Recent content in Redis on Java 技术探秘</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 10 Jan 2021 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.szlinkroutes.com/tags/redis/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【docker实践】之二：安装redis</title>
      <link>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%AE%9E%E8%B7%B5%E4%B9%8B%E4%BA%8C%E5%AE%89%E8%A3%85redis/</link>
      <pubDate>Sun, 10 Jan 2021 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/docker/docker%E5%AE%9E%E8%B7%B5%E4%B9%8B%E4%BA%8C%E5%AE%89%E8%A3%85redis/</guid>
      <description>1.获取镜像 # 先查询镜像，找到自己想要的 docker search redis # 拉取镜像，可指定tag，如拉取redis 5.0：docker pull redis:5.0 # 如果未指定tag，则拉取最新版本 docker pull redis:5.0 2.编写redis配置文件 由于docker容器的独立性，在容器删除时，redis中持久化的文件也会删除。为了解决这个问题，我们在启动docker时，需要将redis的持久化文件目录映射到宿主机，这样只即使docker删除了，只要不删除宿主机的文件，数据文件会一直保留，下次要使用时，只须重新运行一个docker容器，将redis的持久化文件目录映射到宿主机的相应目录即可。&#xA;目录规划如下：&#xA;新建/data/docker_data/redis_5.0目录 进入/data/docker_data/redis_5.0，创建conf、data、logs目录 进入/data/docker_data/redis_5.0/conf目录，创建文本文件，内容如下： bind 0.0.0.0 protected-mode yes port 6379 daemonize no pidfile /var/run/redis_6379.pid loglevel notice logfile &amp;#34;&amp;#34; databases 16 always-show-logo yes requirepass 2v8P5#ai1b%i save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /data appendonly yes appendfilename &amp;#34;appendonly.aof&amp;#34; appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes 将文件名保存为redis.</description>
    </item>
    <item>
      <title>spring&#43;redis自主实现分布式session</title>
      <link>https://www.szlinkroutes.com/categories/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/spring&#43;redis%E8%87%AA%E4%B8%BB%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8Fsession%E9%9D%9Espring-session%E6%96%B9%E5%BC%8F/</link>
      <pubDate>Sun, 13 Sep 2020 00:00:00 +0000</pubDate>
      <guid>https://www.szlinkroutes.com/categories/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/spring&#43;redis%E8%87%AA%E4%B8%BB%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8Fsession%E9%9D%9Espring-session%E6%96%B9%E5%BC%8F/</guid>
      <description>背景：最近对一个老项目进行改造，使其支持多机部署，其中最关键的一点就是实现多机session共享。项目有多老呢，jdk版本是1.6，spring版本是3.2，jedis版本是2.2。&#xA;1.方案的确定 接到这项目任务后，理所当然地google了，一搜索，发现解决方案分为两大类：&#xA;tomcat的session管理 spring-session 对于“tomcat的session管理”，很不幸，线上代码用的是resin，直接pass了；&#xA;对于“spring-session”，这是spring全家桶系列，项目中正好使用了spring，可以很方便集成，并且原业务代码不用做任何发动，似乎是个不错的选择。但是，在引入spring-session过程中发生了意外：项目中使用的jedis版本不支持！项目中使用的jedis版本是2.2,而spring-session中使用的jedis版本是2.5，有些命令像&amp;quot;set PX/EX NX/XX&amp;quot;，项目中使用的redis是不支持的，但spring-session引入的jedis支持，直接引入的话，风险难以把控，而升级项目中的redis版本的话，代价就比较高了。&#xA;综上所述，以上两个方案都行不能，既然第三方组件行不通，那就只能自主实现了。&#xA;通过参考一些开源项目的实现，自主实现分布式session的关键点有以下几点：&#xA;使用servlet的filter功能来接管session； 使用redis来管理全局session 2.使用filter来接管session 为了实现此功能，我们定义如下几个类：&#xA;SessionFilter：servlet的过滤器，替换原始的session DistributionSession：分布式session，实现了HttpSession类； SessionRequestWrapper：在filter中用来接管session； 类的具体实现如下：&#xA;SessionFilter类&#xA;/** * 该类实现了Filter */ public class SessionFilter implements Filter { /** redis的相关操作 */ @Autowired private RedisExtend redisExtend; @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //这里将request转换成自主实现的SessionRequestWrapper //经过传递后，项目中获取到的request就是SessionRequestWrapper ServletRequest servletRequest = new SessionRequestWrapper((HttpServletRequest)request, (HttpServletResponse)response, redisExtend); chain.doFilter(servletRequest, response); } @Override public void destroy() { } } ServletRequestWrap类</description>
    </item>
  </channel>
</rss>
