<?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 ffff65535</title><link>https://blog.ffff65535.com/tags/redis/</link><description>Recent content in Redis on ffff65535</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 20 May 2022 22:21:21 +0800</lastBuildDate><atom:link href="https://blog.ffff65535.com/tags/redis/index.xml" rel="self" type="application/rss+xml"/><item><title>Spring cache + Redis LocalDateTime反序列化</title><link>https://blog.ffff65535.com/posts/2022/05/20/spring-cache-redis-localdatetime-serializable/</link><pubDate>Fri, 20 May 2022 22:21:21 +0800</pubDate><guid>https://blog.ffff65535.com/posts/2022/05/20/spring-cache-redis-localdatetime-serializable/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>/**
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* DateTime格式化字符串
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>*/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>private static final String DEFAULT_DATETIME_PATTERN &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;yyyy-MM-dd HH:mm:ss&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>/**
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* Date格式化字符串
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>*/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>private static final String DEFAULT_DATE_PATTERN &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;yyyy-MM-dd&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>/**
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>* Time格式化字符串
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>*/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>private static final String DEFAULT_TIME_PATTERN &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;HH:mm:ss&amp;#34;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>private RedisCacheConfiguration getRedisCacheConfiguration&lt;span style="color:#f92672">()&lt;/span> &lt;span style="color:#f92672">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> // 配置序列化（解决乱码的问题）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> RedisCacheConfiguration config &lt;span style="color:#f92672">=&lt;/span> RedisCacheConfiguration.defaultCacheConfig&lt;span style="color:#f92672">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> //Key序列化方式redisSerializer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .serializeKeysWith&lt;span style="color:#f92672">(&lt;/span>RedisSerializationContext.SerializationPair.fromSerializer&lt;span style="color:#f92672">(&lt;/span>keySerializer&lt;span style="color:#f92672">()))&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .serializeValuesWith&lt;span style="color:#f92672">(&lt;/span>RedisSerializationContext.SerializationPair.fromSerializer&lt;span style="color:#f92672">(&lt;/span>valueSerializer&lt;span style="color:#f92672">()))&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .disableCachingNullValues&lt;span style="color:#f92672">()&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> config;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>/**
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * key 序列化
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> *
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * @return
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> */
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>private RedisSerializer&amp;lt;String&amp;gt; keySerializer&lt;span style="color:#f92672">()&lt;/span> &lt;span style="color:#f92672">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> new StringRedisSerializer&lt;span style="color:#f92672">()&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>/**
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * 值采用JSON序列化
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> *
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> * @return
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> */
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>private RedisSerializer&amp;lt;Object&amp;gt; valueSerializer&lt;span style="color:#f92672">()&lt;/span> &lt;span style="color:#f92672">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Jackson2JsonRedisSerializer jackson2JsonRedisSerializer &lt;span style="color:#f92672">=&lt;/span> new Jackson2JsonRedisSerializer&lt;span style="color:#f92672">(&lt;/span>Object.class&lt;span style="color:#f92672">)&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> // 解决查询缓存转换异常的问题
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ObjectMapper om &lt;span style="color:#f92672">=&lt;/span> new ObjectMapper&lt;span style="color:#f92672">()&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> om.setVisibility&lt;span style="color:#f92672">(&lt;/span>PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY&lt;span style="color:#f92672">)&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> om.activateDefaultTyping&lt;span style="color:#f92672">(&lt;/span>new ObjectMapper&lt;span style="color:#f92672">()&lt;/span>.getPolymorphicTypeValidator&lt;span style="color:#f92672">()&lt;/span>, ObjectMapper.DefaultTyping.NON_FINAL&lt;span style="color:#f92672">)&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jackson2JsonRedisSerializer.setObjectMapper&lt;span style="color:#f92672">(&lt;/span>om&lt;span style="color:#f92672">)&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> // Java8日期日期处理 LocalTime,LocalDate,LocalDateTime
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> JavaTimeModule javaTimeModule &lt;span style="color:#f92672">=&lt;/span> new JavaTimeModule&lt;span style="color:#f92672">()&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> javaTimeModule.addSerializer&lt;span style="color:#f92672">(&lt;/span>LocalDateTime.class, new LocalDateTimeSerializer&lt;span style="color:#f92672">(&lt;/span>DateTimeFormatter.ofPattern&lt;span style="color:#f92672">(&lt;/span>DEFAULT_DATETIME_PATTERN&lt;span style="color:#f92672">)))&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> javaTimeModule.addSerializer&lt;span style="color:#f92672">(&lt;/span>LocalDate.class, new LocalDateSerializer&lt;span style="color:#f92672">(&lt;/span>DateTimeFormatter.ofPattern&lt;span style="color:#f92672">(&lt;/span>DEFAULT_DATE_PATTERN&lt;span style="color:#f92672">)))&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> javaTimeModule.addSerializer&lt;span style="color:#f92672">(&lt;/span>LocalTime.class, new LocalTimeSerializer&lt;span style="color:#f92672">(&lt;/span>DateTimeFormatter.ofPattern&lt;span style="color:#f92672">(&lt;/span>DEFAULT_TIME_PATTERN&lt;span style="color:#f92672">)))&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> javaTimeModule.addDeserializer&lt;span style="color:#f92672">(&lt;/span>LocalDateTime.class, new LocalDateTimeDeserializer&lt;span style="color:#f92672">(&lt;/span>DateTimeFormatter.ofPattern&lt;span style="color:#f92672">(&lt;/span>DEFAULT_DATETIME_PATTERN&lt;span style="color:#f92672">)))&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> javaTimeModule.addDeserializer&lt;span style="color:#f92672">(&lt;/span>LocalDate.class, new LocalDateDeserializer&lt;span style="color:#f92672">(&lt;/span>DateTimeFormatter.ofPattern&lt;span style="color:#f92672">(&lt;/span>DEFAULT_DATE_PATTERN&lt;span style="color:#f92672">)))&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> javaTimeModule.addDeserializer&lt;span style="color:#f92672">(&lt;/span>LocalTime.class, new LocalTimeDeserializer&lt;span style="color:#f92672">(&lt;/span>DateTimeFormatter.ofPattern&lt;span style="color:#f92672">(&lt;/span>DEFAULT_TIME_PATTERN&lt;span style="color:#f92672">)))&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> om.registerModule&lt;span style="color:#f92672">(&lt;/span>javaTimeModule&lt;span style="color:#f92672">)&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jackson2JsonRedisSerializer.setObjectMapper&lt;span style="color:#f92672">(&lt;/span>om&lt;span style="color:#f92672">)&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> jackson2JsonRedisSerializer;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>nextcloud配置缓存</title><link>https://blog.ffff65535.com/posts/2022/03/21/nextcloud-configures-the-cache/</link><pubDate>Mon, 21 Mar 2022 23:27:22 +0800</pubDate><guid>https://blog.ffff65535.com/posts/2022/03/21/nextcloud-configures-the-cache/</guid><description>&lt;p>/config/config.php&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;#39;memcache.local&amp;#39; =&amp;gt; &amp;#39;\OC\Memcache\APCu&amp;#39;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;#39;memcache.locking&amp;#39; =&amp;gt; &amp;#39;\OC\Memcache\Redis&amp;#39;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;#39;redis&amp;#39; =&amp;gt; [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#39;host&amp;#39; =&amp;gt; &amp;#39;127.0.0.1&amp;#39;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &amp;#39;port&amp;#39; =&amp;gt; 6379,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>],
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>参考文档&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://docs.nextcloud.com/server/14/admin_manual/configuration_server/caching_configuration.html">https://docs.nextcloud.com/server/14/admin_manual/configuration_server/caching_configuration.html&lt;/a>&lt;/p>&lt;/blockquote>
&lt;h3 id="小型私人家庭服务器">&lt;strong>小型/私人家庭服务器&lt;/strong>&lt;/h3>
&lt;p>仅使用 APCu：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;#39;memcache.local&amp;#39; =&amp;gt; &amp;#39;\OC\Memcache\APCu&amp;#39; ,
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="小型组织单服务器设置">&lt;strong>小型组织，单服务器设置&lt;/strong>&lt;/h3>
&lt;p>使用 APCu 进行本地缓存，使用 Redis 进行文件锁定：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-html" data-lang="html">&lt;span style="display:flex;">&lt;span>&amp;#39;memcache.local&amp;#39; =&amp;gt; &amp;#39;\OC\Memcache\APCu&amp;#39;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;#39;memcache.locking&amp;#39; =&amp;gt; &amp;#39;\OC\Memcache\Redis&amp;#39;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;#39;redis&amp;#39; =&amp;gt; array(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&amp;#39;host&amp;#39; =&amp;gt; &amp;#39;localhost&amp;#39;,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>	&amp;#39;port&amp;#39; =&amp;gt; 6379,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>),
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="大型组织集群设置">&lt;strong>大型组织，集群设置&lt;/strong>&lt;/h3>
&lt;p>对除本地 memcache 之外的所有内容使用 Redis：&lt;/p></description></item></channel></rss>