概念 | Redis是一种内存型的NoSQL数据库,优点是快,常用来做缓存用。Redis存储数据的方法是以key-value的形式,value类型支持字符串,列表,哈希等多种类型。 |
重点 | 四中优化,info信息,在线不停止redis情况下,动态修改redis配置文件。 |
源码编译安装redis | |
1. | //上传redis安装包 |
2. | [root@Ansible ~]# yum -y install wget gcc gcc-c++ make tar openssl-devel cmake //安装依赖包 [root@Ansible ~]# tar xf redis-4.0.11.tar.gz -C /usr/src //解压redis到程序安装目录 [root@Ansible ~]# cd /usr/src/redis-4.0.11/ //进入目录 [root@Ansible redis-4.0.11]# make && make MALLOC=jemalloc && make PREFIX=/usr/local/redis install //编译安装 |
3. | [root@Ansible redis-4.0.11]# cd /usr/local/redis/ //进入redis目录 [root@Ansible redis]# ls bin //当前目录只有一个bin目录 |
4. | [root@Ansible redis]# mkdir -p /usr/local/redis/conf //创建conf目录,用于存放redis的配置文件 [root@Ansible redis]# cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/ //拷贝配置文件到conf目录中 [root@Ansible redis]# cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis/conf/ //拷贝配置文件到conf目录中 |
5. | [root@Ansible redis]# ln -s /usr/local/redis/bin/* /usr/local/bin/ //创建软链接 [root@Ansible redis]# which redis-server /usr/local/bin/redis-server //查看服务端连接命令是否存在 [root@Ansible redis]# redis-server --version Redis server v=4.0.11 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=f3a9b1e0a250c51b //服务端连接命令 [root@Ansible redis]# redis-cli --version redis-cli 4.0.11 //客户端连接命令 |
Redis服务启动和系统参数调整 | |
优化配置文件 | [root@Ansible redis]# cp conf/redis.conf{,.bak} //备份配置文件 [root@Ansible redis]# egrep -v "^#|^$" conf/redis.conf.bak > conf/redis.conf //优化配置文件,去掉$和# [root@Ansible redis]# mkdir -p /data/redis //创建目录,用来存放redis产生的数据 |
补充 | Redis数据库缓存,是用缓存存储数据的,重启数据会丢失,以前的缓存叫memcached,一旦宕机,数据就会丢失。Redis通过它的持久化模式,可以让数据不丢失,因此,memcached被淘汰。Redis在硬盘上也有数据目录,是运维自己创建的,需要修改配置文件的指定内容。 四个零:监听本机所有网卡的任意IP地址 工作目录一旦产生,redis产生的所有东西,都会被放在此路径下。 |
编辑配置文件 | [root@Ansible redis]# vim conf/redis.conf //进入redis的配置文件,进行修改 |
启动redis | [root@Ansible redis]# redis-server /usr/local/redis/conf/redis.conf //启动redis [root@Ansible redis]# netstat -antup | grep redis //查看redis的监听端口6379是否打开 [root@Ansible redis]# redis-cli shutdown //关闭redis [root@Ansible redis]# redis-server /usr/local/redis/conf/redis.conf //启动redis [root@Ansible redis]# redis-cli -h 127.0.0.1 //使用-h参数加地址进行连接 //连接成功可以使用exit进行退出,也可以直接在里面输入shutdown直接暂停redis服务 //默认情况下,直接输入redis-cli为本地登录 |
查看日志文件 | [root@Ansible redis]# cd /data/redis/ //进入redis数据目录 [root@Ansible redis]# cat redis.log //查看日志文件 警告1: 警告2: 警告3: Rdb是redis数据持久方式之一,用于将内存的数据映射到磁盘 警告4: 巨大内存页:容量巨大的数据变量,就是目前来说,kerner允许写入容量很大的数据到redis里。 Redis 异步非阻塞I/O模型,epoll,但是redis是单进程,单线程工作的,它只有一个进程,这个进行只有一个线程接待用户的读写请求。 因此redis非常害怕写入一个数据量非常大的数据,这会导致数据阻塞,如果没有解决这个用户的数据写入,他是无法接待下一个用户的。所以redis在工作中,禁止写入大数据。 |
优化 警告 |
[root@Ansible ~]# echo "* - nofile 10240" >> /etc/security/limits.conf //修改文件描述(*表示对所有用户生效) [root@Ansible ~]# tail -1 /etc/security/limits.conf * - nofile 10240 在6.5是写入/etc/re.local中,让其开机执行;在7.5中,写道limits.conf这样更加的方便,而且可以指定用户,写入/etc/rc.local中直接对所有用户生效。 退出,重新登录即生效 -a:查看所有;-n查看文件描述 |
[root@Ansible ~]# sysctl -a | grep soma //查看TCP连接数 Stsctl -a :显示所有系统参数 [root@Ansible ~]# echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf //修改TCP连接数为10240 [root@Ansible ~]# sysctl -p //从指定文件加载系统参数 | |
[root@Ansible ~]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf //允许系统超额时,抢占内存 [root@Ansible ~]# tail -1 /etc/sysctl.conf //查看 [root@Ansible ~]# sysctl -p //从指定文件加载系统参数 [root@Ansible ~]# sysctl -a | grep commit //查看系统内存状态 | |
[root@Ansible ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local [root@Ansible ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local //关闭内核巨大内存支持 [root@Ansible ~]# tail -2 /etc/rc.local //查看rc.local内容 //查看系统日志 | |
[root@Ansible ~]# sh /etc/rc.local //执行 [root@Ansible ~]# cd /data/redis/ //进入redis数据目录 [root@Ansible redis]# > redis.log //清空日志 [root@Ansible redis]# redis-server /usr/local/redis/conf/redis.conf //启动redis [root@Ansible redis]# cat redis.log //查看redis日志文件内容 | |
Redis客户端使用和字符串简单操作 | |
登录 | [root@Ansible ~]# redis-cli 127.0.0.1:6379> exit //默认本地登录 [root@Ansible ~]# redis-cli -h localhost -p 6379 localhost:6379> exit //本地端口登录 [root@Ansible ~]# redis-cli -h 127.0.0.1 127.0.0.1:6379> exit //本地登录 |
redis 字符串 | 127.0.0.1:6379> set name xiaofa #增加键(key)和值(value) OK 127.0.0.1:6379> get name #根据键获取值 "xiaofa" 127.0.0.1:6379> set name lijinglong #修改键的值 OK 127.0.0.1:6379> get name "lijinglong" 127.0.0.1:6379> set NAME xiaofa #命令不区分大小写 OK 127.0.0.1:6379> GET name "lijinglong" 127.0.0.1:6379> del name #删除键值 (integer) 0 127.0.0.1:6379> get name (nil) |
非交互式 | [root@Ansible ~]# redis-cli set name welcom OK [root@Ansible ~]# redis-cli get name "welcom" [root@Ansible ~]# redis-cli del name (integer) 1 [root@Ansible ~]# redis-cli get name (nil) |
Redis列表集合简单操作 | |
列表 | 127.0.0.1:6379> lpush names yun1 #创建一个列表,名称为names,并 (integer) 1 从左边推入一个值yun1 127.0.0.1:6379> lpush names yun2 #向列表names左边推入一个值yun2 (integer) 2 127.0.0.1:6379> lpush names yun3 (integer) 3 127.0.0.1:6379> lpush names yun4 (integer) 4 127.0.0.1:6379> lpush names yun5 (integer) 5 127.0.0.1:6379> lrange names 0 -1 #查看列表names从索引0开始到结束所 1) "yun5" 有的值 2) "yun4" 3) "yun3" 4) "yun2" 5) "yun1" 127.0.0.1:6379> lrange names 0 1 #查看索引0和1的值 1) "yun5" 2) "yun4" 127.0.0.1:6379> lrange names 0 2 1) "yun5" 2) "yun4" 3) "yun3" 127.0.0.1:6379> lpush names yun1 (integer) 6 127.0.0.1:6379> lrange names 0 -1 1) "yun1" 2) "yun5" 3) "yun4" 4) "yun3" 5) "yun2" 6) "yun1" 127.0.0.1:6379> lrem names 1 yun1 #从左边数删除第一个yun1 (integer) 1 127.0.0.1:6379> lrange names 0 -1 1) "yun5" 2) "yun4" 3) "yun3" 4) "yun2" 5) "yun1" 127.0.0.1:6379> rpush names yun (integer) 6 127.0.0.1:6379> rpush names yun (integer) 7 127.0.0.1:6379> lrange names 0 -1 1) "yun5" 2) "yun4" 3) "yun3" 4) "yun2" 5) "yun1" 6) "yun" 7) "yun" 127.0.0.1:6379> lrem names 0 yun #从列表左边数删除所有的yun元素 (integer) 2 127.0.0.1:6379> lrange names 0 -1 1) "yun5" 2) "yun4" 3) "yun3" 4) "yun2" 5) "yun1" 127.0.0.1:6379> lpop names #移除列表左边的元素 "yun5" 127.0.0.1:6379> rpop names #移除列表右边的元素 "yun1" 127.0.0.1:6379> lrange names 0 -1 1) "yun4" 2) "yun3" 3) "yun2" 127.0.0.1:6379> lset names 0 yun #修改列表左起第一个元素 OK 127.0.0.1:6379> lrange names 0 -1 1) "yun" 2) "yun3" 3) "yun2" |
集合 | 127.0.0.1:6379> sadd ages 25 #向集合中添加元素 (integer) 1 127.0.0.1:6379> sadd ages 30 (integer) 1 127.0.0.1:6379> sadd ages 35 (integer) 1 127.0.0.1:6379> sadd ages 40 (integer) 1 127.0.0.1:6379> sadd ages 45 (integer) 1 127.0.0.1:6379> sadd ages 50 (integer) 1 127.0.0.1:6379> sadd ages 50 #失败,集合的元素具有唯一性 (integer) 0 127.0.0.1:6379> smembers ages #查看集合中的元素 1) "25" 2) "30" 3) "35" 4) "40" 5) "45" 6) "50" 127.0.0.1:6379> srem ages 25 #移除集合里的25元素 (integer) 1 127.0.0.1:6379> spop ages #随机移除集合中的一个元素 "35" 127.0.0.1:6379> sismember ages 40 # 查找集合中是否有元素40 (integer) 1 |
Redis的hash和订阅简单操作 | |
Hash 操作 | 127.0.0.1:6379> hset info name 'yunjisuan' #增加一个hash (integer) 1 127.0.0.1:6379> hset info age 25 (integer) 1 127.0.0.1:6379> hset info location 'bejing' (integer) 1 127.0.0.1:6379> hgetall info 1) "name" 2) "yunjisuan" 3) "age" 4) "25" 5) "location" 6) "bejing" 127.0.0.1:6379> hget info name "yunjisuan" 127.0.0.1:6379> hdel info name age (integer) 2 127.0.0.1:6379> hgetall info 1) "location" 2) "bejing" 127.0.0.1:6379> del info (integer) 1 127.0.0.1:6379> hmset info name 'yunjisuan' age 25 location 'bejing' OK 127.0.0.1:6379> hgetall info 1) "name" 2) "yunjisuan" 3) "age" 4) "25" 5) "location" 6) "bejing" 127.0.0.1:6379> exit |
Redis的 订阅操作 | |
使用shell往redis批量添加数据 | |
1. | 批量往redis server上插入数据 [root@Ansible ~]# for line in `seq -w 50`;do redis-cli set name_${line} value_${line};done //批量插入数据。 解释:for循环,line在50个生成的随机数中取值,-w以列显示;set创建增 加键值,名称为name_50个随机数,值为50个随机数。 可以视作:for line in `seq -w 50` do redis-cli set name_${line} value_${line}; done [root@Ansible ~]# redis-cli info //查看最后一行的键数 |
2. | 查看key的情况 127.0.0.1:6379> keys * //查看所有key命令,不建议使用,上千万的key会使redis服务器堵塞 127.0.0.1:6379> randomkey #随机返回一个key "name_40" 127.0.0.1:6379> randomkey "name_21" 127.0.0.1:6379> scan 0 #分页查看key 1) "52" 2) 1) "name_02" 2) "name_39" 3) "name_42" 4) "name_11" 5) "name_47" 6) "name_13" 7) "name_08" 8) "name_23" 9) "name_12" 10) "name_50" 11) "name_40" 127.0.0.1:6379> scan 1 1) "45" 2) 1) "name_33" 2) "name_43" 3) "name_19" 4) "name_05" 5) "name_14" 6) "name_26" 7) "names" 8) "name_35" 9) "name_48" 10) "name_38" 11) "name_15" |
Redis服务器info状态信息查看 | |
概念 | redis提供了一个info命令查看redis服务器的信息,类似linux提供一个top命令查看系统的信息 |
[root@Ansible ~]# redis-cli info //查看服务器的信息 | |
Redis服务器加密和无密码攻击 | |
Redis 增加密码 | Mysql有账号、密码和权限分配,但是redis只有密码,没有账号 |
1.通过redis配置文件增加密码,需要重启redis [root@Ansible ~]# echo 'requirepass "abc123,"' >> /usr/local/redis/conf/redis.conf //在redis配置文件追加内容,abc123,为redis密码 也可以直接进入配置文件进行修改 [root@Ansible ~]# redis-cli shutdown //关闭redis服务 [root@Ansible ~]# redis-server /usr/local/redis/conf/redis.conf //开启redis服务 交互式登录 [root@Ansible ~]# redis-cli //进入redis 127.0.0.1:6379> keys * (error) NOAUTH Authentication required. //需要验证才能看,不然不能看 127.0.0.1:6379> auth abc123, OK //通过auth验证密码 127.0.0.1:6379> set name benet OK 非交互式登录 [root@Ansible ~]# redis-cli -a abc123, get name Warning: Using a password with '-a' option on the command line interface may not be safe. "benet" //-a参数后跟密码,再加上命令即可。提示的警告为密码是明文出现的,不安全,但仍旧执行命令。也可以加上-h指定登入ip,-p加上端口,进行精确定位。 | |
2.使用交互式的方式给redis增加密码,无需重启redis 在工作中,redis一般是不容许重启的,所以以下步骤解决如此问题。 redis配置文件是在硬盘中的;reids是在内存中的进程,运行时他会将配置文件调用到内存中,交给CPU执行。我们修改的是硬盘上的配置文件,进程中的配置文件是没有改变的,所以要重启,改变内存中的配置文件,让radis重新读取配置文件。 而无需重启,就是修改内存中的redis配置文件,再将其应用到硬盘中,这样redis程序就不用中断了。 操作 [root@Ansible ~]# tail -1 /usr/local/redis/conf/redis.conf requirepass "abc123," //查看redis配置文件是否有redis密码 [root@Ansible ~]# sed -i '$d' /usr/local/redis/conf/redis.conf //使用sed命令,去掉redis配置文件最后一行 [root@Ansible ~]# tail -1 /usr/local/redis/conf/redis.conf aof-rewrite-incremental-fsync yes //查看redis配置文件,是否还存在redis配置文件 [root@Ansible ~]# redis-cli -a abc123, shutdown //关掉redis服务(因为内存中的配置文件没有更改,所以我们仍然需要用密码来关闭) [root@Ansible ~]# netstat -antup | grep redis //查看redis进程是否关闭 [root@Ansible ~]# redis-server /usr/local/redis/conf/redis.conf //开启redis服务 此时,环境搭建已经完成,下面要进行的就是不暂停redis服务,直接停止密 码。 [root@Ansible ~]# redis-cli 127.0.0.1:6379> //登入redis 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "" //获取redis配置的密码的信息,此时是没有密码的 127.0.0.1:6379> config set requirepass xiaofa OK //写入redis密码 127.0.0.1:6379> config get requirepass (error) NOAUTH Authentication required. //密码设置后是立即生效的,因此不让擦好看密码信息 127.0.0.1:6379> auth xiaofa OK //进行密码验证 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "xiaofa" //查看密码信息 127.0.0.1:6379> config rewrite OK //将配置进行重写,保存 [root@Ansible ~]# tail -2 /usr/local/redis/conf/redis.conf # Generated by CONFIG REWRITE requirepass "xiaofa" //查看配置文件,是否存在设置的密码 通过这个方式,可以修改redis中90%的配置 | |
入侵密码redis服务 | |
Redis不能让外部直接解除,不能给redis弹性公网IP,必须让其从内网网段写入,而且形成三网结构,这样公网黑客连不到内网,才能保证安全。 |
Linux基础——Redis(一)
最新推荐文章于 2024-10-02 05:39:15 发布