• redis基本操作和在springboot中的使用


    本文介绍redis的使用

    redis启动步骤

    windows下安装redis下载网址 https://github.com/MicrosoftArchive/redis
    
    安装完成后,到安装目录下运行
        redis-cli.exe
        shutdown
        exit
        redis-server.exe redis.windows.conf
    
    获取配置                            CONFIG GET *
    设置端口                            redis-server --port 6380
    开启redis-cli运行                   redis-cli -h 127.0.0.1 -p 6380
    关闭redis                           redis-cli shutdown
    

    说明

    redis键命名规则,尽量采取database:tablenaem这种风格
    
    5种数据类型
        string 不能超过512MB
        hash
        list 
        set
        zset
    
    本文并没有涉及到分布式的,主要是因为本人,暂未涉及分布式的邻域
    
    本文同时列出了如何在spring-boot中使用redis,使用的是jedis的链接客户端
    
    spring-boot-starter-data-redis内置的是lettuce链接客户端,用法比较高级哈,jedis对于我这种菜鸡够用了
    

    redis自增自减相关操作

    incr counter                       等效于++counter
    decr counter                       等效于--counter
    incrby counter 5                   等效于counter+=5          
    decrby counter 6                   等效于counter-=6
    incrbyfloat counter 10.1           等效于counter+=10.1 
    

    redis string

    set操作

    set name "yejiawei" 
    set name yejiawei nx               键存在设置不成功
    set name yejiawei xx               键必须存在设置才会成功
    set name yejiawei ex 10            设置键10秒后过期
    set name yejiawei px 5000          设置键5000毫秒后过期
    setex name 10 yejiawei             设置键10秒后过期
    setnx name yejiawei                键存在设置不成功
    mset name yejiawei age 18 sex boy  批量设置值
    getset name yejiawei               获取name的原值
    setrange name 2 ja                 在指定的位置设置值,从0开始
    getrange name 2 3                  获取第2和第3个索引位的字符
    

    get操作

    get name                           取键
    mget name age sex                  批量获取值
    

    其他操作

    append name haha                   追加值  
    strlen name                        获取字符串长度
    

    redis hash

    set操作

    hset obj:1 a 1                     为obj:1添加一对{a: 1}
    hmset user:1 a 1 b 2 c 3           批量设置
    

    get操作

    hget obj:1 a                       获取obj:1中的 a
    hmget user:1 a b c                 批量获取
    

    其他操作

    hdel obj:1 a                       删除obj:1中的键
    hlen obj:1                         获取obj:1中键的个数
    hexists user:1 a                   判断是否存在
    hkeys user:1                       获取所有的键
    hvals user:1                       获取所有的键值
    hgetall user:1                     获取所有的键值对
    hincrby user:1 a 10                自增整数
    hincrbyfloat  user:1 a 1.1         自增小数
    hstrlen user:1 a                   计算长度
    

    redis list

    set操作

    rpush arr 1 2 3 4 5                设置列表
    lpush arr 0                        左插元素
    rpush arr 10                       右插元素
    linsert arr before 1 100           在1之前插入100
    linsert arr after 1 100            在1之后插入100
    lset arr 1 10000                   将索引位为1的设置成10000
    

    get操作

    lrange arr 0 -1                    从左到右列出元素
    lindex arr -1                      获取最后一个元素
    

    其他操作

    llen arr                           获取元素个数
    lpop arr                           左删一个元素
    rpop arr                           右删一个元素
    lrem arr 1 5                       从左到右删除一个5
    lrem arr -1 5                      从右到左删除一个5
    lrem arr 0 5                       删除所有的5
    ltrim arr 0 2                      删除索引0和2之间的所有元素
    

    redis set

    set元素不能重复,不能使用下标访问

    set集合的相关操作

    sadd myset a b c                        添加元素 
    srem myset a                            删除元素 
    scard myset                             计算元素个数
    sismember myset a                       判断元素是否在集合中
    srandmember myset 2                     随机返回2的元素
    spop myset                              随机弹出元素
    smembers myset                          查看集合中的元素
    sinter myset myset1                     取两集合交集
    sunion myset myset1                     取两集合并集
    sdiff myset myset1                      取两集合差集
    sinterstore extramyset myset myset1     将两集合差集保存在extramyset中
    

    redis 有序集合

    不允许元素重复,允许设置分值排序

    有序集合相关操作

    zadd arr 100 name                       添加成员
    zadd arr 101 name1 102 name2 103 name3
    zadd arr nx 104 name4                   必须不存在
    zadd arr xx 104 name4                   必须存在
    zadd arr ch 104 name4                   返回受影响元素个数
    zadd arr incr 104 name4                 自增
    zcard arr                               返回成员个数
    zscore arr name1                        获取成员分数
    zrank arr name1                         获取成员排名,从低到高
    zrevrank arr name1                      获取成员排名,从高到低
    zrem arr name                           删除
    zincrby arr 1 name1                     增加成员分数
    zrange arr 1 3 withscores               返回排名是1和3的成员,从低到高
    zrevrange arr 1 3 withscores            返回排名是1和3的成员,从高到低
    zrangebyscore arr 100 105 withscores    返回指定分数之间的成员
    zrangebyscore arr (100 +inf withscores  返回100正无穷之间的成员
    zcount arr 100 105                      返回指定分数之间元素个数
    zremrangebyrank arr 1 2                 删除排名1和2之间的元素,升序
    zremrangebyscore arr 105 106            删除分数105和106之间的元素
    

    键过期

    expire name 10                          设置键10秒后自动删除
    ttl name                                查看键剩余存活时间,秒
    pttl name                               查看键剩余存活时间,豪秒
    expireat hello 1469980800               秒级过期时间戳
    pexpire key milliseconds                毫秒级过期时间戳
    pexpireat key milliseconds-timestamp    毫秒级时间戳timestamp
    persist name                            删除键的过期设置,直接set键也会导致过期时间失效
    

    迁移键

    第一种:
    move key db                             将键迁移到其他数据库
    
    
    第二种:
    dump key                                序列化键,源redis实例
                                            例如序列化的结果 "x00yejiaweiax00xe5xaatsx9fIxc2x81"     
    restore key ttl value                   复原键,目标redis实例,其中ttl为过期时间,设置为0表示没有过期时间
                                            例如复原键,restore namer 0 "x00yejiaweiax00xe5xaatsx9fIxc2x81"
                        
    
    第三种:
        migrate 127.0.0.1 6370 name 0 1000  将name迁移到6370端口的0号数据库超时时间为1000毫秒
        migrate 127.0.0.1 6370 name 0 1000 replace 替换已经存在的值
        migrate 127.0.0.1 6370 "" 0 5000  keys age arr sex 迁移多个键
    

    其他键的操作

    keys *                             列出所有键
    keys [e]*                          列出e开头的键
    scan 0                             也是遍历键,只不过它一次遍历一点,根据上一次执行返回的cursor执行下一次遍历
    hscan obj:1 0                      遍历hash中的键
    sscan myset 0                      遍历set中的键
    zscan arr 0                        遍历有序set中的键
    dbsize                             获取键的总个数
    exists name                        检查是否存在某个键,返回1或0
    type name                          返回键数据类型
    object encoding arr                查看list集合,内部数据结构实现类型
    del name                           删除键,支持同时删除多个,以空格隔开
    rename key newkey                  重命名
    renamenx key newkey                重命名,新键名不存在
    randomkey                          随机取一个键
    

    数据库管理

    多数据库

    
    redis默认16个数据库,通过索引来切换数据库
    
    select 10 进入第11个数据库
    
    建议不要使用多数据库,可以使用多个redis实例搞定
    

    数据库清除

    flushdb 清除当前数据库
    flushall 清楚所有数据库
    

    redis配置

    慢查询记录

    slowlog-log-slower-than 10000     执行时间超过10000毫秒的命令会记录到日志中
    slowlog-max-len 128               慢查询日志列表最大记录条数  
    
    config set slowlog-log-slower-than 20000
    config set slowlog-max-len 1000
    config rewrite 将设置保存到配置文件中
    slowlog get  展示日志列表
    slowlog len  列表条数
    slowlog reset 日志重置
    

    redis其他相关操作

    事务

    终止事务
        multi
        set name yejiawei
        discard
    提交事务
        multi
        set name yejiawei
        exec
    

    发布和订阅

    subscribe channel:sports 订阅频道
    publish channel:sports "Tim won the championship" 发布消息
    unsubscribe channel:sports 取消订阅
    psubscribe it* 订阅以it为开头的频道
    pubsub channels 查看活跃频道,也就是至少有一个人订阅的频道
    pubsub channels channel:*r* 包含r的频道
    pubsub numsub channel:sports 查看频道订阅数
    pubsub numpat 查看通过psubscribe形式订阅的订阅数
    

    主从

    slaveof 127.0.0.1 6379
    

    redis在spring-boot中的配置和基本使用

    说明

    本部分内容,本人根据最新版的spring-boot-starter-data-redis配置,网上很多都是老的,bug很多
    

    项目目录

    依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <exclusions>
            <exclusion>
    			<groupId>io.lettuce</groupId>
    			<artifactId>lettuce-core</artifactId>
    		</exclusion>
    	</exclusions> 
    </dependency>	
    
    <dependency>
    	<groupId>redis.clients</groupId>
    	<artifactId>jedis</artifactId>
    </dependency> 
    
    <dependency>
    	<groupId>org.apache.commons</groupId>
    	<artifactId>commons-pool2</artifactId>
    	<version>2.6.0</version>
    </dependency>
    

    properties配置

    # ===============================
    # DATABASE
    # ===============================
    
    spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true
    spring.datasource.username=root
    spring.datasource.password=123
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    
    server.tomcat.uri-encoding=UTF-8
    server.port=9001
    
    mybatis.mapper-locations=classpath:mapperxml/*.xml
    
    # ===============================
    # REDIS
    # ===============================
    spring.redis.host=localhost
    spring.redis.port=6379
    #spring.redis.password=root #根据需要
    # 连接超时时间(毫秒)
    spring.redis.timeout=10000
    # Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
    spring.redis.database=0
    # 连接池最大连接数(使用负值表示没有限制) 默认 8
    spring.redis.lettuce.pool.max-active=8
    # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
    spring.redis.lettuce.pool.max-wait=-1
    # 连接池中的最大空闲连接 默认 8
    spring.redis.lettuce.pool.max-idle=8
    # 连接池中的最小空闲连接 默认 0
    spring.redis.lettuce.pool.min-idle=0
    

    RedisConfig

    package com.springlearn.learn.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.GenericToStringSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    @Configuration
    public class RedisConfig {
        @Bean
        JedisConnectionFactory jedisConnectionFactory() {
            return new JedisConnectionFactory();
        }
    
        @Bean
        RedisTemplate< String, Object > redisTemplate() {
            final RedisTemplate< String, Object > template =  new RedisTemplate< String, Object >();
            template.setConnectionFactory( jedisConnectionFactory() );
            template.setKeySerializer( new StringRedisSerializer() );
            template.setHashValueSerializer( new GenericToStringSerializer< Object >( Object.class ) );
            // template.setValueSerializer( new GenericToStringSerializer< Object >( Object.class ) );
            template.setValueSerializer( new GenericJackson2JsonRedisSerializer() ); // 序列化json,反序列化时直接强转就行了
            return template;
        }
    }
    

    TestController

    package com.springlearn.learn.controller;
    
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.dao.DataAccessException;
    import org.springframework.data.redis.core.RedisOperations;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.SessionCallback;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class TestController {
    
        @Autowired
        private RedisTemplate<String, Object> template;
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
        
        @ResponseBody
        @RequestMapping(value = "/test1/{id}", method = RequestMethod.GET, produces = "application/json")
        public List<Map<String, Object>> Test1(HttpServletRequest request, @PathVariable int id){
            // 序列化
            // 直接这样设置,会调用GenericJackson2JsonRedisSerializer序列化,对象
            // String sql = "select * from test";
            // List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
            // template.opsForValue().set("obj", list);
    
            // 第一种使用方式
            // 直接访问template中的方法即可
            // ListOperations<String, Object> listOps = template.opsForList();
            // List<Object> list = listOps.range("arr", 0, -1);
    
            // 第二种方式
            // 调用Callback直接访问链接对象
            // return template.execute(new RedisCallback<Object>() {
            //     public Object doInRedis(RedisConnection connection) throws DataAccessException {
            //       Long size = connection.dbSize();
            //       // Can cast to StringRedisConnection if using a StringRedisTemplate
            //       // 这里你可以访问和redis的api,方法基本同名
            //       // 如果你操作字符串比较多建议使用StringRedisTemplate
            //       connection.set("key".getBytes(), "value".getBytes());
            //       return connection.get("key".getBytes());
            //     }
            // });
    
            // 第三种方式
            // 使用事务
            List<Object> txResults = template.execute(new SessionCallback<List<Object>>() {
                public List<Object> execute(RedisOperations operations) throws DataAccessException {
                  operations.multi();
                  template.opsForValue().get("obj");
                  return operations.exec();
                }
            });
            return (List<Map<String, Object>>)txResults.get(0);
        }
    }
    

    结尾

    本篇文章花了本人较多的时间,搜索了N多国内外资料,最后整理出来的
    
    如果有你想知道但是上面没有的,请提出来,我试着帮你们解决,更加完善本文
    
  • 相关阅读:
    DIV垂直居中
    表格细边框 并且CSS3加圆角
    CSS3自定义滚动条样式 -webkit-scrollbar
    select绑定json数组对象 asp.net
    正则表达式 匹配同一行 相同类型
    iis7.5 aspx,ashx的mime类型
    position:absolute,绝对定位和相对定位,JQ隐藏和显示
    IE专用CSS,最全的CSS hack方式一览
    AJAX安全-Session做Token
    HTTP Live Streaming直播(iOS直播)技术分析与实现
  • 原文地址:https://www.cnblogs.com/ye-hcj/p/9661892.html
Copyright © 2020-2023  润新知