文章目录
SpringBoot的常用注解
- @SpringBootApplication:是多个注解的合体其中最重要的是
@springBootconfiguration
,@EnableAutoconfiguration
,@componentScan
@SpringBootConfiguration
:继承自@configuration
,其实两种功能一致,都是标注该类为配置类,读取启动类。@EnableAutoConfiguration
:这个注解是SpirngBoot自动配置的核心所在,通过此注解,能所有符合自动配置条件的bean的定义加载到spring容器中。(即开启自动装配)@SpringBootApplication中的@Componentscan作用
:该注解会扫描当前包及子包下面被纳入sping容器管理的类。
@PropertySource("classpath:xxx.yml")
:读取文件@ConfigurationProperties(prefix = "user")
// 指定yml文件的前缀@Value("${值}")
// 读取yml中的值@MapperScan("com.hsh.mapper")
:扫dao层将实例注入dao层@ComponentScan({"com.hsh","com"})
:扫包(service,controller...)@EnableTransactionManagement
:开启事务注解
Redis
Redis的五种常用类型
string(字符串)、
list(链表)、
set(集合)、
zset(sorted set --有序集合)
hash(哈希类型)
Redis的常用指令
通用指令
命令 | 解释 |
---|---|
help [command] |
帮助指令 |
keys partten |
找键 |
DEL key |
删除键 |
EXISTS 键1 [键2 键3] |
返回值是找到几个键 |
EXPIRE key time |
给键设置时间 |
ttl 键 |
查看一个KEY的剩余有效期 |
String的常见命令有:
- SET:添加或者修改已经存在的一个String类型的键值对
- GET:根据key获取String类型的value
- MSET:批量添加多个String类型的键值对
- MGET:根据多个key获取多个String类型的value
- INCR:让一个整型的key自增1
- INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
- INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
- SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
- SETEX:添加一个String类型的键值对,并且指定有效期
Hash的常见命令有:
- HSET key field value:添加或者修改hash类型key的field的值
- HGET key field:获取一个hash类型key的field的值
- HMSET:批量添加多个hash类型key的field的值
- HMGET:批量获取多个hash类型key的field的值
- HGETALL:获取一个hash类型的key中的所有的field和value
- HKEYS:获取一个hash类型的key中的所有的field
- HINCRBY:让一个hash类型key的字段值自增并指定步长
- HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
List的常见命令有:
- LPUSH key element ... :向列表左侧插入一个或多个元素
- LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
- RPUSH key element ... :向列表右侧插入一个或多个元素
- RPOP key:移除并返回列表右侧的第一个元素
- LRANGE key star end:返回一段角标范围内的所有元素
- BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil,
语法:blpop key [key] timeout
Set的常见命令有:
- SADD key member ... :向set中添加一个或多个元素
- SREM key member ... : 移除set中的指定元素
- SCARD key: 返回set中元素的个数
- SISMEMBER key member:判断一个元素是否存在于set中
- SMEMBERS key:获取set中的所有元素
- SINTER key1 key2 ... :求key1与key2的交集
- SDIFF key1 key2...:求key1与key2的差集。有key1的所有值,没有keys2的值的集合。
- SUNlON key1 key2 ...:求key1和key2的并集
SortedSet的常见命令有:
- ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
- HGETALL key
- ZREM key member:删除sorted set中的一个指定元素
- ZSCORE key member : 获取sorted set中的指定元素的score值
ZRANK key member
:升序获取sorted set 中的指定元素的排名。(排名从0开始)ZREVRANK key memeber
:降序获取sorted set 中的指定元素的排名(排名从0开始)- ZCARD key:获取sorted set中的元素个数
- ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
-inf表示负无穷, +inf是正无穷。
。zcount sortedSet -inf (76 这(表示不包括76
- ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值。
ZRANGE key min max [WITHSCORES]
:按照score升序
排序后,获取指定排名范围内的元素。ZREVRANGE sortedSet 0 -1 WITHSCORES
-1 表示最后一个成员。WITHSCORES表示值也一起显示。zrevrangekey min max [WITHSCORES]
:按照score降序
排序后,获取指定排名范围内的元素。ZREVRANGE sortedSet 0 -1 WITHSCORES
-1 表示最后一个成员。WITHSCORES表示值也一起显示。ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
:按照score排序后,获取指定score范围内的元素。
WITHSCORES(可选)
:同时返回成员及其分数。
LIMIT offset count(可选)
:用于分页,offset是起始偏移量(从0开始),count是返回的元素数量。- ZDIFF、ZINTER、ZUNION:求差集、交集、并集
雪崩,穿透,击穿的概念
雪崩,穿透,击穿,都是高并发场景下,大量请求查询,为找到redis存的数据,直接去查询了数据库,造成数据库压力大
雪崩:redis大量缓存同时过期,同时请求数据库,造成数据库压力大 解决方案:随机设置缓存的失效时间
击穿:热点数据缓存刚过期,大量请求绕过缓存请求数据库,造成数据库压力大 解决方案: 缓存预热,key永不过期或者使用期间内不过期
穿透:查询缓存和数据库都不存在的数据,导致数据库压力大, 解决方案:缓存空对象,布隆过滤器
Redis能做什么
- 缓存,毫无疑问这是Redis当今最为人熟知的使用场景。再提升服务器性能方面非常有效;
- 排行榜,如果使用传统的关系型数据库来做这个事儿,非常的麻烦,而利用Redis的SortSet数据结构能够非常方便搞定;
- 计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等,这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个API的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;
注:限速器也是对请求限流的一种实现方式。 - 好友关系,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好友、共同爱好之类的功能;
- 简单消息队列,除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦;
- Session共享,默认Session是保存在服务器的文件中,即当前服务器,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息。
StringRedisTemplate与RedisTemplate区别
StringRedisTemplate与RedisTemplate区别点
- 两者的关系是StringRedisTemplate继承RedisTemplate
- 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
- (序列化类)RedisTemplate使用的是JdkSerializationRedisSerializer 存入数据会将数据
先序列化成字节数组然后在存入Redis数据库。 StringRedisTemplate使用的是StringRedisSerializer
使用时注意事项:
当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。
但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。
哨兵作用/哨兵宕机会怎么样
什么是哨兵
哨兵的作用就是对Redis的系统的运行情况的监控,它是一个独立进程。
它的功能有2个:
1、 监控主数据库和从数据库是否运行正常;
2、 主数据出现故障后自动将从数据库转化为主数据库;
redis如何实现高可用
哨兵,集群