2020
2121< script class ="next-config " data-name ="main " type ="application/json "> { "hostname" :"simuleite.github.io" , "root" :"/" , "images" :"/images" , "scheme" :"Muse" , "darkmode" :false , "version" :"8.21.0" , "exturl" :false , "sidebar" :{ "position" :"left" , "width_expanded" :320 , "width_dual_column" :240 , "display" :"post" , "padding" :18 , "offset" :12 } , "hljswrap" :true , "copycode" :{ "enable" :false , "style" :null } , "fold" :{ "enable" :false , "height" :500 } , "bookmark" :{ "enable" :false , "color" :"#222" , "save" :"auto" } , "mediumzoom" :false , "lazyload" :false , "pangu" :false , "comments" :{ "style" :"tabs" , "active" :null , "storage" :true , "lazyload" :false , "nav" :null } , "stickytabs" :false , "motion" :{ "enable" :true , "async" :false , "transition" :{ "menu_item" :"fadeInDown" , "post_block" :"fadeIn" , "post_header" :"fadeInDown" , "post_body" :"fadeInDown" , "coll_header" :"fadeInLeft" , "sidebar" :"fadeInUp" } } , "i18n" :{ "placeholder" :"搜索..." , "empty" :"没有找到任何搜索结果:${query}" , "hits_time" :"找到 ${hits} 个搜索结果(用时 ${time} 毫秒)" , "hits" :"找到 ${hits} 个搜索结果" } , "path" :"/search.xml" , "localsearch" :{ "enable" :true , "top_n_per_article" :1 , "unescape" :false , "preload" :false } } </ script > < script src ="/js/config.js "> </ script >
2222
23- < meta name ="description " content ="General # 返回给定模式的keysKEYS patterKEYS * # 返回全部KEYS set* # 返回set开头的keysEXISTS keyTYPE keyDEL key String SET key valueGET key# Set Extend TimeSETEX key seconds value# Set When Key Not ExistSETNX key va ">
23+ < meta name ="description " content ="基本操作 General # 返回给定模式的keysKEYS patterKEYS * # 返回全部KEYS set* # 返回set开头的keysEXISTS keyTYPE keyDEL key String SET key valueGET key# Set Extend TimeSETEX key seconds value# Set When Key Not ExistSETNX ">
2424< meta property ="og:type " content ="article ">
2525< meta property ="og:title " content ="Redis使用 ">
2626< meta property ="og:url " content ="http://simuleite.github.io/ComputerScience/%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/Redis%E4%BD%BF%E7%94%A8/index.html ">
2727< meta property ="og:site_name " content ="SMULET's BLOG ">
28- < meta property ="og:description " content ="General # 返回给定模式的keysKEYS patterKEYS * # 返回全部KEYS set* # 返回set开头的keysEXISTS keyTYPE keyDEL key String SET key valueGET key# Set Extend TimeSETEX key seconds value# Set When Key Not ExistSETNX key va ">
28+ < meta property ="og:description " content ="基本操作 General # 返回给定模式的keysKEYS patterKEYS * # 返回全部KEYS set* # 返回set开头的keysEXISTS keyTYPE keyDEL key String SET key valueGET key# Set Extend TimeSETEX key seconds value# Set When Key Not ExistSETNX ">
2929< meta property ="og:locale " content ="zh_CN ">
3030< meta property ="article:published_time " content ="2024-10-26T16:00:00.000Z ">
31- < meta property ="article:modified_time " content ="2024-10-27T07:06:48.748Z ">
31+ < meta property ="article:modified_time " content ="2024-12-30T02:42:59.732Z ">
3232< meta property ="article:author " content ="SIMULEITE ">
3333< meta property ="article:tag " content ="基本操作 ">
3434< meta name ="twitter:card " content ="summary ">
141141 < div class ="sidebar-panel-container ">
142142 <!--noindex-->
143143 < div class ="post-toc-wrap sidebar-panel ">
144- < div class ="post-toc animated "> < ol class ="nav "> < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#general "> < span class ="nav-text "> General</ span > </ a > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#string "> < span class ="nav-text "> String</ span > </ a > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#hash "> < span class ="nav-text "> Hash</ span > </ a > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#list "> < span class ="nav-text "> List</ span > </ a > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#set "> < span class ="nav-text "> Set</ span > </ a > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#sorted-set-zset "> < span class ="nav-text "> Sorted Set / ZSet</ span > </ a > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#redis-for-java "> < span class ="nav-text "> Redis for Java</ span > </ a > < ol class ="nav-child "> < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#redis-data-redis "> < span class ="nav-text "> Redis Data Redis</ span > </ a > </ li > </ ol > </ li > </ ol > </ div >
144+ < div class ="post-toc animated "> < ol class ="nav "> < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C "> < span class ="nav-text "> 基本操作</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#general "> < span class ="nav-text "> General</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#string "> < span class ="nav-text "> String</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#hash "> < span class ="nav-text "> Hash</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#list "> < span class ="nav-text "> List</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#set "> < span class ="nav-text "> Set</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#sorted-set-zset "> < span class ="nav-text "> Sorted Set / ZSet</ span > </ a > </ li > </ ol > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#redis-for-java "> < span class ="nav-text "> Redis for Java</ span > </ a > < ol class ="nav-child "> < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#redis-data-redis "> < span class ="nav-text "> Redis Data Redis</ span > </ a > </ li > </ ol > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#%E6%8C%81%E4%B9%85%E5%8C%96 "> < span class ="nav-text "> 持久化</ span > </ a > < ol class ="nav-child "> < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#rdb "> < span class ="nav-text "> RDB</ span > </ a > </ li > < li class ="nav-item nav-level-2 "> < a class ="nav-link " href ="#aof "> < span class ="nav-text "> AOF</ span > </ a > </ li > </ ol > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#%E4%BA%8B%E5%8A%A1 "> < span class ="nav-text "> 事务</ span > </ a > </ li > < li class ="nav-item nav-level-1 "> < a class ="nav-link " href ="#%E4%B9%90%E8%A7%82%E9%94%81 "> < span class ="nav-text "> 乐观锁</ span > </ a > </ div >
145145 </ div >
146146 <!--/noindex-->
147147
@@ -215,9 +215,15 @@ <h1 class="post-title" itemprop="name headline">
215215 < i class ="far fa-calendar "> </ i >
216216 </ span >
217217 < span class ="post-meta-item-text "> 发表于</ span >
218-
219218
220- < time title ="创建时间:2024-10-27 00:00:00 / 修改时间:15:06:48 " itemprop ="dateCreated datePublished " datetime ="2024-10-27T00:00:00+08:00 "> 2024-10-27</ time >
219+ < time title ="创建时间:2024-10-27 00:00:00 " itemprop ="dateCreated datePublished " datetime ="2024-10-27T00:00:00+08:00 "> 2024-10-27</ time >
220+ </ span >
221+ < span class ="post-meta-item ">
222+ < span class ="post-meta-item-icon ">
223+ < i class ="far fa-calendar-check "> </ i >
224+ </ span >
225+ < span class ="post-meta-item-text "> 更新于</ span >
226+ < time title ="修改时间:2024-12-30 10:42:59 " itemprop ="dateModified " datetime ="2024-12-30T10:42:59+08:00 "> 2024-12-30</ time >
221227 </ span >
222228
223229
@@ -229,18 +235,19 @@ <h1 class="post-title" itemprop="name headline">
229235
230236
231237
232- < div class ="post-body " itemprop ="articleBody "> < h1 id ="general "> < a class ="markdownIt-Anchor " href ="#general "> </ a > General</ h1 >
238+ < div class ="post-body " itemprop ="articleBody "> < h2 id ="基本操作 "> < a class ="markdownIt-Anchor " href ="#基本操作 "> </ a > 基本操作</ h2 >
239+ < h2 id ="general "> < a class ="markdownIt-Anchor " href ="#general "> </ a > General</ h2 >
233240< figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> # 返回给定模式的keys</ span > < br > < span class ="line "> KEYS patter</ span > < br > < span class ="line "> KEYS * # 返回全部</ span > < br > < span class ="line "> KEYS set* # 返回set开头的keys</ span > < br > < span class ="line "> EXISTS key</ span > < br > < span class ="line "> TYPE key</ span > < br > < span class ="line "> DEL key</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
234- < h1 id ="string "> < a class ="markdownIt-Anchor " href ="#string "> </ a > String</ h1 >
241+ < h2 id ="string "> < a class ="markdownIt-Anchor " href ="#string "> </ a > String</ h2 >
235242< figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> SET key value</ span > < br > < span class ="line "> GET key</ span > < br > < span class ="line "> # Set Extend Time</ span > < br > < span class ="line "> SETEX key seconds value</ span > < br > < span class ="line "> # Set When Key Not Exist</ span > < br > < span class ="line "> SETNX key value</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
236- < h1 id ="hash "> < a class ="markdownIt-Anchor " href ="#hash "> </ a > Hash</ h1 >
243+ < h2 id ="hash "> < a class ="markdownIt-Anchor " href ="#hash "> </ a > Hash</ h2 >
237244< figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> HSET key field value</ span > < br > < span class ="line "> HGET key field</ span > < br > < span class ="line "> HDEL key field</ span > < br > < span class ="line "> # Get All Fields</ span > < br > < span class ="line "> HKEYS key</ span > < br > < span class ="line "> # Get All Values</ span > < br > < span class ="line "> HVALS key</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
238245< figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> flowchart LR</ span > < br > < span class ="line "> key[key]</ span > < br > < span class ="line "> item[</ span > < br > < span class ="line "> field1: value1</ span > < br > < span class ="line "> field2: value2</ span > < br > < span class ="line "> ]</ span > < br > < span class ="line "> key --> item</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
239- < h1 id ="list "> < a class ="markdownIt-Anchor " href ="#list "> </ a > List</ h1 >
246+ < h2 id ="list "> < a class ="markdownIt-Anchor " href ="#list "> </ a > List</ h2 >
240247< figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> LPUSH key value1 value2</ span > < br > < span class ="line "> # Get Key From Start To Stop</ span > < br > < span class ="line "> LRANGE key start stop</ span > < br > < span class ="line "> # Right POP</ span > < br > < span class ="line "> RPOP key</ span > < br > < span class ="line "> # List Length</ span > < br > < span class ="line "> LLEN key</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
241- < h1 id ="set "> < a class ="markdownIt-Anchor " href ="#set "> </ a > Set</ h1 >
248+ < h2 id ="set "> < a class ="markdownIt-Anchor " href ="#set "> </ a > Set</ h2 >
242249< figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> SADD key mem1 mem2</ span > < br > < span class ="line "> SMEMBERS key</ span > < br > < span class ="line "> # Set Size</ span > < br > < span class ="line "> SCARD key</ span > < br > < span class ="line "> SINTER key1 key2</ span > < br > < span class ="line "> SUNION key1 key2</ span > < br > < span class ="line "> # Delete</ span > < br > < span class ="line "> SREM key mem1 mem2</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
243- < h1 id ="sorted-set-zset "> < a class ="markdownIt-Anchor " href ="#sorted-set-zset "> </ a > Sorted Set / ZSet</ h1 >
250+ < h2 id ="sorted-set-zset "> < a class ="markdownIt-Anchor " href ="#sorted-set-zset "> </ a > Sorted Set / ZSet</ h2 >
244251< figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> ZADD key score1 mem1 score2 mem2</ span > < br > < span class ="line "> # Show List</ span > < br > < span class ="line "> ZRANGE key start stop (WITHSCORES)</ span > < br > < span class ="line "> # Increse Member</ span > < br > < span class ="line "> ZINCRBY key increment member</ span > < br > < span class ="line "> ZREM key mem1 mem2</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
245252< span id ="more "> </ span >
246253< h1 id ="redis-for-java "> < a class ="markdownIt-Anchor " href ="#redis-for-java "> </ a > Redis for Java</ h1 >
@@ -253,7 +260,20 @@ <h2 id="redis-data-redis"><a class="markdownIt-Anchor" href="#redis-data-redis">
253260< figure class ="highlight xml "> < figcaption > < span > pom.xml</ span > </ figcaption > < table > < tr > < td class ="code "> < pre > < span class ="line "> < span class ="comment "> <!-- Redis --></ span > </ span > < br > < span class ="line "> < span class ="tag "> << span class ="name "> dependency</ span > ></ span > </ span > < br > < span class ="line "> < span class ="tag "> << span class ="name "> groupId</ span > ></ span > org.springframwork.boot< span class ="tag "> </< span class ="name "> groupId</ span > ></ span > </ span > < br > < span class ="line "> < span class ="tag "> << span class ="name "> artifactId</ span > ></ span > spring-boot-starter-data-redis< span class ="tag "> </< span class ="name "> artifactId</ span > ></ span > </ span > < br > < span class ="line "> < span class ="tag "> </< span class ="name "> dependency</ span > ></ span > </ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
254261< figure class ="highlight yml "> < figcaption > < span > application.yml</ span > </ figcaption > < table > < tr > < td class ="code "> < pre > < span class ="line "> < span class ="attr "> spring:</ span > </ span > < br > < span class ="line "> < span class ="attr "> redis:</ span > </ span > < br > < span class ="line "> < span class ="attr "> host:</ span > < span class ="string "> localhost</ span > </ span > < br > < span class ="line "> < span class ="attr "> port:</ span > < span class ="number "> 6379</ span > </ span > < br > < span class ="line "> < span class ="attr "> password:</ span > < span class ="string "> yourPassword</ span > </ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
255262< figure class ="highlight java "> < table > < tr > < td class ="code "> < pre > < span class ="line "> < span class ="meta "> @Configuration</ span > </ span > < br > < span class ="line "> < span class ="meta "> @Slf4j</ span > </ span > < br > < span class ="line "> < span class ="keyword "> public</ span > < span class ="keyword "> class</ span > < span class ="title class_ "> RedisConfiguration</ span > {</ span > < br > < span class ="line "> < span class ="meta "> @Bean</ span > </ span > < br > < span class ="line "> < span class ="keyword "> public</ span > RedisTemplate < span class ="title function_ "> redisTemplate</ span > < span class ="params "> (RedisConnectionFactory redisConnectionFactory)</ span > {</ span > < br > < span class ="line "> log.info(< span class ="string "> "开始创建Redis模板对象..."</ span > );</ span > < br > < span class ="line "> < span class ="type "> RedisTemplate</ span > < span class ="variable "> redisTemplate</ span > < span class ="operator "> =</ span > < span class ="keyword "> new</ span > < span class ="title class_ "> RedisTemplate</ span > ();</ span > < br > < span class ="line "> < span class ="comment "> // Set Redis Connection Factory Object</ span > </ span > < br > < span class ="line "> redisTemplate.setConnectionFactory(redisConnectionFactory);</ span > < br > < span class ="line "> < span class ="comment "> // Set Key Serializer</ span > </ span > < br > < span class ="line "> redisTemplate.setKeySerializer(< span class ="keyword "> new</ span > < span class ="title class_ "> StringRedisSerializer</ span > ());</ span > < br > < span class ="line "> < span class ="keyword "> return</ span > redisTemplate;</ span > < br > < span class ="line "> }</ span > < br > < span class ="line "> }</ span > < br > < span class ="line "> </ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
256-
263+ < h1 id ="持久化 "> < a class ="markdownIt-Anchor " href ="#持久化 "> </ a > 持久化</ h1 >
264+ < h2 id ="rdb "> < a class ="markdownIt-Anchor " href ="#rdb "> </ a > RDB</ h2 >
265+ < figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> # redis-cli</ span > < br > < span class ="line "> save</ span > < br > < span class ="line "> # 将会生成一个dump.rdb</ span > < br > < span class ="line "> bgsave</ span > < br > < span class ="line "> # 后台保存</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
266+ < h2 id ="aof "> < a class ="markdownIt-Anchor " href ="#aof "> </ a > AOF</ h2 >
267+ < p > 保存执行的命令为日志。每次重启加载所有命令。</ p >
268+ < figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> # redis.windows.conf</ span > < br > < span class ="line "> appendonly yes</ span > < br > < span class ="line "> appendsync always/everysec/no</ span > < br > < span class ="line "> auto-aof-rewrite-percentage 100</ span > < br > < span class ="line "> auto-aof-rewrite-min-size 64mb</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> # redis-cli</ span > < br > < span class ="line "> bgrewriteaof # 重新编排命令,让重启时执行更高效</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
269+ < h1 id ="事务 "> < a class ="markdownIt-Anchor " href ="#事务 "> </ a > 事务</ h1 >
270+ < figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> # 开始事务</ span > < br > < span class ="line "> multi</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> set key value</ span > < br > < span class ="line "> # ... your command</ span > < br > < span class ="line "> # 中途取消</ span > < br > < span class ="line "> discard</ span > < br > < span class ="line "> </ span > < br > < span class ="line "> # 执行</ span > < br > < span class ="line "> exec </ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
271+ < h1 id ="乐观锁 "> < a class ="markdownIt-Anchor " href ="#乐观锁 "> </ a > 乐观锁</ h1 >
272+ < p > 乐观锁:不认为别人会来抢占资源,所以会直接对数据进行操作,在操作时验证是否资源已被占用。</ p >
273+ < blockquote >
274+ < p > 乐观锁会比较数据是否和原数据一致,一致,说明没有人抢占资源,可以修改。</ p >
275+ </ blockquote >
276+ < figure class ="highlight plaintext "> < table > < tr > < td class ="code "> < pre > < span class ="line "> watch key</ span > < br > < span class ="line "> # 通过版本号,而不通过值来判断</ span > < br > < span class ="line "> unwatch key</ span > < br > </ pre > </ td > </ tr > </ table > </ figure >
257277 </ div >
258278
259279
0 commit comments