redis使用(springboot整合redis 快速上手,实测)

添加依赖:


    org.apache.commons
    commons-pool2

        
            org.springframework.boot
            spring-boot-starter-data-redis
        

添加相关配置(config)将bean对象交给spring管理

@Configuration
public class RedisTemplateConfig {
    

@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
    RedisTemplate redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(factory);
    // 使用Jackson2JsonRedisSerialize 替换默认序列化
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
            ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
    jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

    // 设置value的序列化规则和 key的序列化规则
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
    RedisSerializer redisSerializer = new StringRedisSerializer();
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

    //解决查询缓存转换异常的问题
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
            ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    // 配置序列化(解决乱码的问题),过期时间30秒
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            // .entryTtl(Duration.ofSeconds(1800000))
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
            .disableCachingNullValues();

    RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
            .cacheDefaults(config)
            .build();
    return cacheManager;
}

}

redis(String) 命令

flushdb  清空本数据库

flushall  清空所有数据

shutdown 关闭

exit    推出

keys *  查询所有数据

exists name 判断是否存在

move name 1 代表移除这个值

expire name 10 设置name过期时间10s

ttl name 查看剩余过期时间

type name 查看数值类型

append name 123 在原来的基础上进行拼接 返回字符串长度(如果该key值不存在,则表示set一个值)

incr num num值+1

decr num num值-1

incrby num 10 num+10

decrby num -5 num-5

getrange name 0 -1  截取name的全部值

setrange name 2 xx 从那么的第三个开始替代

setex name 10 shitou 设置kv值为10s的过期时间

setnx name jack  如果没有这个值,则设置,在分布式中较常用

mset k1 v1 k2 v2 k3 v3 批量设置kv值

mget k1 k2 批量取值

msetnx 批量设置多个值的时候,如果存在一个值,则都会失败,这是原子操作

getset  先取值,再存值

redis(List) 命令

lpush one 1 2 3  从左边开始添加值

rpush one 4 5  从右边开始添加值

lrange one 0 -1 取全部的值

lpop one 从左边移除一个值

rpop one  从右侧移除一个值
127.0.0.1:6379> lindex one 3  获取下表为3 的值
"4"
127.0.0.1:6379> llen one    获取长度
(integer) 5

ltrim one 0 2 截取三个值

rpoplpush one two 从one 的里面右边取一个值左侧存入 two

lset one 0 3 在list为one,修改下标为0 的值 改成3

linsert one after 4 5 在list 中元素为 4 的后面添加5

redis(set) 命令

sadd one 1 2 3 向里面添加值

smembers one 取出所有值

sismember one 5 查看set集合是否存在5

scard one 查看set元素个数

srem one 3 把one里面的3移除

srandmember one 随机取出一个数值 可以在末尾添加数值,表示随机取出多少个值

spop one  随机移除一个元素

smove one two 3  将集合one的3值移动到结合two里面

sdiff one two 两个集合比较,结果为two中没有的元素

sinsert one two 两个集合的交集

sunion one two 两个集合的并集(去重多余的了)

redis(hash) 命令  相当于map操作

hset stone one 1 存值

hget stone one 取值

hmset stone one 1 two 2 存多个值

hmget stone one two 取多个值

hgetall stone 取出所有值

hdel stone one  删除 stone 里面的one

hlen stone 获取kv键值对数量

hexists stone one  判断是否存在一个值

hkeys stone 查询所有key 的值

hvals stone 查询所有的values 的值

hincrby stone one 1 加一操作

hincrby stone one -1 减一操作

hsetnx stone two 3 如果不存在 two 这个kv键值对,则可以添加。否则写入失败

redis(zset)命令

zadd one 1 one 添加一个值

zadd one 1 one 2 two 添加多个值

zrange one 0 -1 取出多个值

zrangebyscore one -inf +inf 排序展示,从小往大的排序

zrangebyscore one 0 5000 withscores 范围(0 5000)内取值 ,且带有排序数值

zrem stone one 移除one

zrevrange stone 0 -1  从大到小排序

zcount stone 1 3  统计 1 到3 中间的值个数

redis 之三大特殊类型(geospatial)

geoadd china:city  116.40 39.9 beijing 121.47 31.23 shanghai 106.50 29.35 chongqing 114.05 22.52 shenzheng 120.16 30.24 hangzhou 108.96 34.26 xian(经度 维度 名称)

geopos china:city xian 取值坐标  可以同时获取多个

geodist china:city beijing shanghai km 计算两个城市之间的距离 单位km

georadius china:city 110 30 500 km withcoord 查询(经度110 维度30)500公里范围内的城市,展示出该城市的经纬度 可以展示数量(后面添加  count 1)

zrange china:city 0 -1 查询所有的值

zrem china:city beijing 移除北京

redis之三大特殊(hypeologlog)有一定容错性,占用12kb内存

pfadd one a b c e f  添加值

pfadd two e f g

pfmerge three one two 将one 与two 的值合并到three 并集 (同时去重)

pfcount three  统计three 的数据量        

redis之三大特殊(bitmaps)位存储

setbit one 1 0  在one 里面存入 key 1 value 0

bitget one 1 取出one 里面 1 的value值

bitcount one  统计one 里面有多少个1

redis之事务(单条线程执行是原子性的,多线程不保证原子性)

multi 开启一个事务

set k1 v1 写入一个事务

exec 按顺序执行事务

discard 放弃事务

编译时异常,则整个事务都不会执行(如中途命令输错),如果是运行时异常,则会继续执行

set k1 v1

multi

incr k1(进行加一,会出错,因为不是数值类型)

set k2 v2 

get k2

exec  结果显示后面的还是会继续执行

set money 100 

watch money 开启监控

multi 开启事务

incrby money 20 新增20(如果此时另外开启一个线程对该值进行修改,则接下来的整个事务都会失败,只能重新开启事务)

exec  会失败

redis redis.conf 配置

bind 127.0.0.1   绑定ip 如果不注销,则默认只允许本地访问

protected-mode yes   保护模式 开启

daemonize yes  开启yes 才能后台运行(守护进程运行)

pidfile /var/run/redis_6379.pid 如果以后台运行,则需要指定一个pid文件

loglevel notice   日志级别 notice 是生产环境级别

logfile ""日志文件位置名称

持久化,在规定的时间/操作,会进行持久化

save 900 1   900秒 有一次操作,就进行持久化
save 300 10
save 60 10000

stop-writes-on-bgsave-error yes   持久化出错,也要继续工作

rdbcompression yes    是否压缩rdb文件,默认开启压缩

rdbchecksum yes   保存rdb文件之前进行是否出错校验

dir ./           rdb 文件保存位置

config set requirepass stone  设置redis密码

maxclients 10000  用于设置同时多少个客户可以进行链接

maxmemory   redis 设置最大内存值

maxmemory-policy noeviction   内存满了,处理策略

appendonly no   默认不开启aof持久化方式默认rdb

appendfilename "appendonly.aof"    持久化文件名字

 #appendfsync always    每次修改就执行
appendfsync everysec   默认每秒同步一次 sync
# appendfsync no      不开启同步

如果aof文件出现错误,redis是不能够启动的,这个时候需要系统提供的工具进行恢复,redis-check-aof --fix

redis使用(springboot整合redis 快速上手,实测)_第1张图片

 

主从配置:

info replication 查看信息 

redis.conf 多个文件修改 1,端口 2,日志名 3,pid名称 4,dump名称

完事了,每个服务端都是主要节点,这个时候,只需要修改从节点就可以了

slaveof ip port(指定哪个 ip 端口的为主要节点)

主机掉线了,从机仍旧链接主机,主机恢复之后,仍旧可以从主机上面获取数据。

通过命令指定的从机操作,从机掉线,如果重新上线,则从机变成新的主机,需要重新设置。

slaveof no one 使自己变成主机

哨兵模式

编辑 sentinel.conf 文件 添加: sentinel monitor myredis6379 127.0.0.1 6379 1

表示监控的服务器,ip 和端口

启动哨兵  redis-sentinel sentinel.conf

大概3分钟左右 会重新选举,进行故障转移。如果之前的主机恢复了,只能归并到从机。

最后奉上redis命令大全(中文网)

Redis命令中心(Redis commands) -- Redis中国用户组(CRUG)

你可能感兴趣的:(redis,spring,boot,java)