cat docker-compose.yml
version: '3'
services:
redis:
image: redis:5.0.7-buster
restart: IfNotPresent
container_name: my_redis
# Redis 的密码需要自己在与容器共享的配置 redis.conf 中加入,即更改配置中 requirepass yourpassword
#command: redis-server /usr/local/etc/redis/redis.conf
# 直接在其所在目录下执行 docker-compose up -d,即可在 Docker 中生成一个带密码的 Redis 容器。
#command: redis-server --requirepass leojiang
ports:
- "6379:6379"
volumes:
- ./data/redis:/data
# 容器与宿主机时间同步
- /etc/localtime:/etc/localtime
environment:
TIME_ZONE: Asia/Shanghai
找一个配置文件:
方法一:官网下载(推荐)
方法二:根据版本解压一个官网的二进制包抽出来一个redis.conf
wget http://download.redis.io/releases/redis-5.0.7.tar.gz tar xzf
redis-5.0.7.tar.gz
redis-service.yaml
apiVersion: v1
kind: Service
metadata:
name: redis
labels:
app: redis
namespace: paas-basic
spec:
selector:
app: redis-pod
type: NodePort
ports:
- name: redis-port
port: 6379
targetPort: 6379
protocol: TCP
redis-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-deploy
namespace: paas-basic
labels:
name: redis-deploy-label
spec:
replicas: 1
minReadySeconds: 20 # 容器启动创建X秒后服务可用
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 2
maxUnavailable: 0
selector:
matchLabels:
app: redis-pod
template:
metadata:
labels:
app: redis-pod
spec:
nodeSelector:
redis: "true"
terminationGracePeriodSeconds: 40 #k8s正确、优雅地关闭应用,等待时间30秒
containers:
- name: redis-container
image: redis:5.0.7-buster
imagePullPolicy: IfNotPresent
ports:
- containerPort: 6379
volumeMounts:
- name: redis-volume
mountPath: /data
- name: redis-conf
mountPath: /usr/local/etc/
volumes:
- name: redis-volume
hostPath:
path: /home/k8s-1.19.2/paas-basic/redis/volume
- name: redis-conf
hostPath:
path: /home/k8s-1.19.2/paas-basic/redis/config
k8s部署
1、通过配置文件配置
通过在Redis安装目录下面的redis.conf配置文件中添加以下配置设置内存大小。
//设置Redis最大占用内存大小为100M
maxmemory 100mb
redis的配置文件不一定使用的是安装目录下面的redis.conf文件,启动redis服务的时候是可以传一个参数指定redis的配置文件的。
2、通过命令修改
Redis支持运行时通过命令动态修改内存大小
登录
redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
//设置Redis最大占用内存大小为100M
127.0.0.1:6379> config set maxmemory 100mb
//获取设置的Redis能使用的最大内存大小
127.0.0.1:6379> config get maxmemory
如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存
redis.conf中的maxmemory定义可用最大物理内存,有多种书写方式,以下均为合法:
maxmemory 1048576
maxmemory 1048576B
maxmemory 1000KB
maxmemory 100MB
maxmemory 1GB
maxmemory 1000K
maxmemory 100M
maxmemory 1G
没有带单位尾巴的为字节数,以B结尾的表示相应的大小。但需要注意KB和K、MB和M、GB和G是不同的,如1K表示1000字节,而1KB则为1024字节。
3、查看当前redis节点内存状态
[root@app01 fastdfs]# docker exec -it redis redis-cli -h 127.0.0.1 -p 6379 -a sinoeyes info | grep memory
used_memory:849488
used_memory_human:829.58K
used_memory_rss:2682880
used_memory_rss_human:2.56M
used_memory_peak:849488
used_memory_peak_human:829.58K
used_memory_peak_perc:100.00%
used_memory_overhead:836262
used_memory_startup:786624
used_memory_dataset:13226
used_memory_dataset_perc:21.04%
total_system_memory:16656908288
total_system_memory_human:15.51G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
[root@app01 fastdfs]#
既然可以设置Redis最大占用内存大小,那么配置的内存就有用完的时候。那在内存用完的时候,还继续往Redis里面添加数据不就没内存可用了吗?
实际上Redis定义了几种策略用来处理这种情况:
noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)
allkeys-lru:从所有key中使用LRU算法进行淘汰
volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰
allkeys-random:从所有key中随机淘汰数据
volatile-random:从设置了过期时间的key中随机淘汰
volatile-ttl:在设置了过期时间的key中,根据key的过期时间进行淘汰,越早过期的越优先被淘汰
当使用volatile-lru、volatile-random、volatile-ttl这三种策略时,如果没有key可以被淘汰,则和noeviction一样返回错误。
如何获取及设置内存淘汰策略
获取当前内存淘汰策略:
127.0.0.1:6379> config get maxmemory-policy
通过配置文件设置淘汰策略(修改redis.conf文件):
maxmemory-policy allkeys-lru
通过命令修改淘汰策略:
127.0.0.1:6379> config set maxmemory-policy allkeys-lru