Linux基础——Redis(一)

概念

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

Rdbredis数据持久方式之一,用于将内存的数据映射到磁盘

警告4

巨大内存页:容量巨大的数据变量,就是目前来说,kerner允许写入容量很大的数据到redis里。

Redis 异步非阻塞I/O模型,epoll,但是redis是单进程,单线程工作的,它只有一个进程,这个进行只有一个线程接待用户的读写请求。

因此redis非常害怕写入一个数据量非常大的数据,这会导致数据阻塞,如果没有解决这个用户的数据写入,他是无法接待下一个用户的。所以redis在工作中,禁止写入大数据

优化

警告

  1. 调整系统文件描述符

[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查看文件描述

  1. 调整系统TCP连接数

[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

//从指定文件加载系统参数

  1. 调整系统内存分配策略

[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

//查看系统内存状态

  1. 关闭系统内核巨大内存支持

[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内容

//查看系统日志

  1. 重启redis-server验证修改

[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    #查看索引01的值

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

Redishash和订阅简单操作

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

订阅操作

使用shellredis批量添加数据

1.

批量往redis server上插入数据

[root@Ansible ~]# for line in `seq -w 50`;do redis-cli set name_${line} value_${line};done

//批量插入数据。

解释for循环,line50个生成的随机数中取值,-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"

//查看配置文件,是否存在设置的密码

通过这个方式,可以修改redis90%的配置

入侵密码redis服务

Redis不能让外部直接解除,不能给redis弹性公网IP,必须让其从内网网段写入,而且形成三网结构,这样公网黑客连不到内网,才能保证安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值