Redis 如何做内存优化?
1
、缩短键值的长度
缩短值的长度才是关键,如果值是一个大的业务对象,可以将对象序列化成二进制数组;首
先应该在业务上进行精简,去掉不必要的属性,避免存储一些没用的数据;其次是序列化的
工具选择上,应该选择更高效的序列化工具来降低字节数组大小;以
JAVA
为例,内置的序
列化方式无论从速度还是压缩比都不尽如人意,这时可以选择更高效的序列化工具,如
:
protostuff
,
kryo
等
2
、共享对象池
对象共享池指
Redis
内部维护
[0-9999]
的整数对象池。创建大量的整数类型
redisObject
存在
内存开销,每个
redisObject
内部结构至少占
16
字节,甚至超过了整数自身空间消耗。所以
Redis
内存维护一个
[0-9999]
的整数对象池,用于节约内存。 除了整数值对象,其他类型如
list,hash,set,zset
内部元素也可以使用整数对象池。因此开发中在满足需求的前提下,尽量使
用整数对象以节省内存。
3
、字符串优化
4
、编码优化
5
、控制
key
的数量
Redis的同步机制了解么?
Redis
可以使用主从同步,从从同步。第一次同步时,主节点做一次
bgsave
,并同时将后续
修改操作记录到内存
buffer
,待完成后将
rdb
文件全量同步到复制节点,复制节点接受完
成后将
rdb
镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复
制节点进行重放就完成了同步过程。
是否使用过 Redis 集群,集群的原理是什么?
Redis
集群实现了对
Redis
的水平扩容,即启动
N
个
Redis
节点,将整个数据库分布存储在
这
N
个节点中,每个节点存储总数据的
1/N
。
Redis
集群通过分区(
partition
)来提供一定程度的可用性(
availability
): 即使集群中有一
部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
具体的原理:
-
哨兵机制
Sentinal
着眼于高可用,在
master
宕机时会自动将
slave
提升 为
master
,继
续提供服务。
-
集群分片,
Cluster
着眼于扩展性,在单个
redis
内存不足时,使用
Cluster
进行分片存储。
Shiro 框架
Apache Shiro
是一个强大易用的
java
安全框架,提供了认证、授权、加密和会话管理功能,
可为任何应用提供安全保障
-
从命令应用、移动应用到大型网络及企业应用。
Shiro
已将安全认证相关的功能抽取出来组成一个框架,使用
Shiro
就可以非常快速的完成认
证、授权等功能,降低系统开发成本。
Shiro
使用广泛,
Shiro
可以运行在
web
应用、非
web
应用、集群分布式应用中越来越多的
用户开始使用
Shiro
。
java
领域中
Spring Security
也是一个开源的权限管理框架,但是
Spring Security
依赖
Spring
运行,而
Shiro
就相对独立,最主要因为
Shiro
使用简单、灵活。
Shiro 的运行流程
比如一个登陆流程:
1
、首先调用
Subject.login(token)
进行登录,他会委托给
SecurityManager
2
、
SecurityManager
负责真正的身份验证逻辑;它会委托给
Authenticator
进行身份验证;
3
、
Authenticator
会把相应的
token
传入
Realm
,从
Realm
获取身份验证信息,如果没有就返
回认证失败,有的话就继续执行操作。
如何对密码进行加密?
在
Spring Security
中对密码进行加密通常使用的是密码编码器(
PasswordEncoder
)。
PasswordEncoder
的作用是将明文密码加密成密文密码,以便于存储和校验。
Spring Security
提供了多种常见的密码编码器,例如
BCryptPasswordEncoder
、
SCryptPasswordEncoder
、
StandardPasswordEncoder
等。
Shiro
提供了
PasswordService
及
CredentialsMatcher
用于提供加密密码及验证密码服务。