redis 简介

1.redis是什么?

开源非关系型数据库,是一个高性能的key-values数据库
a:1
b:2
数据可持续化,redis可将数据永久写入磁盘,实现数据持久化
数据不仅支持key-values类型的数据,还可以使用set list zset hash等数据结构
支持主从复制

2.redis的特点有哪些?

2.1 速度快,110000次/s读的速度,81000次/s写的速度
2.2 数据类型丰富
2.3 数据具有原子性

3.redis与其他非关系型数据库有什么不同?

3.1 数据拥有原子性
3.2 数据可持久化

redis安装过程

1.源码下载

wget http://download.redis.io/releases/redis-4.0.11.tar.gz (官网)
wget http://download.redis.io/releases/redis-5.0.6.tar.gz 最新
2019-11-18T10:02:34.png

2.安装

yum install -y gcc gcc-c++

tar xf redis-4.0.11.tar.gz -C /usr/local/

cd /usr/local/redis-4.0.11

make
2019-11-18T10:02:44.png

注意,如果出现下面的问题,请使用:make MALLOC=libc

致命错误:jemalloc/jemalloc.h:没有那个文件或目录

mv /usr/local/redis-4.0.11/ /usr/local/redis

安装完成

redis启动和基本使用

由于我们使用源码安装的,所以redis的启动命令是没有被添加进我们的系统变量的,需要手动配置

export PATH=$PATH:/usr/local/redis/src 设置临时变量

vim /etc/profile 加入长期环境变量
export PATH=$PATH:/usr/local/redis/src
2019-11-18T10:03:00.png

source /etc/profile

启动redis:
没有加入环境变量的:
cd /usr/local/redis/src
./redis-server 如果以这种方式启动,为前台启动
./redis-server & 后台启动

加入环境变量的:
redis-server 前台
redis-server & 后台

或者,拷贝启动脚本到/etc/init.d/获取更便捷的启动方式
cp /usr/local/redis/utils/redis_init_script /etc/init.d/redis

vim /etc/init.d/redis
REDIS_DIR=/usr/local/redis 指定redis安装目录

EXEC=$REDIS_DIR/src/redis-server 指定redis启动命令路径
CLIEXEC=$REDIS_DIR/src/redis-cli 指定redis客户端命令路径

CONF="$REDIS_DIR/redis.conf" 指定redis配置文件路径
2019-11-18T10:03:27.png
vim /usr/local/redis/redis.conf
daemonize yes 将这里改成yes,否则你的redis每次启动都要加'&'才行
2019-11-18T10:03:36.png
修改完成后:
/etc/init.d/redis [start stop]
2019-11-18T10:03:45.png
lsof -i:6379


如果加了密码后,停止redis时报错解决:
......
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
......

vim /etc/init.d/redis
$CLIEXEC -a "password" -p $REDISPORT shutdown 修改这一行
2019-11-18T10:03:55.png


登陆redis:

没有加入环境变量的:
cd /usr/local/redis/src
./redis-cli

加入环境变量的:
redis-cli

127.0.0.1:6379> 只要看到这个提示符,表示登陆成功

127.0.0.1:6379>config get *

==============================================================================

redis配置详解:

主要关心以下几个
daemonize no // 是否以守护进程启动redis(改成yes,否则每次启动redis都得加&)*

pidfile /var/run/redis.pid // redis以守护进程启动后pid文件的路径

port 6379 // redis监听端口 *

bind 127.0.0.1 // redis监听的主机

dir ./ // 指定redis数据目录路径 *

timeout 300 // 指定redis客户端在多长时间后退出登录,如果是0则表示关闭该功能

logfile stdout // 日志记录方式,默认为标准输出,可自定义文件路径

save 900 1 // 该配置默认有三行,表示redis在900s内有一次更改,就将数据写入磁盘
save 300 10 // 300s内有10次便写入
save 60 10000 // 60s内有1w次便写入

masterauth // master设置的供slave连接时使用的密码

requirepass foobared // redis设置连接密码,设置后client登录后需要验证密码才能继续 **

appendonly no // 是否开启数据同步写入,默认为异步写入

=====================================================================

redis基础操作命令

客户端操作命令
本地连接

 # redis-cli        连接本地redis服务器
 
 # redis-cli 
 
  127.0.0.1:6379> auth password    连接本地redis服务器后输入密码
 
 # redis_cli -a password    输入密码后登陆本地redis服务器
 
 --------------------------------------------------------------------
 远程连接
 # redis-cli -h host -p port -a passwd        连接远程redis服务器
 例如:
 # redis-cli -h 3.3.3.8 -p 6379 -a 'test123'

==========================================================================

redis数据类型

string 字符串;该类型是redis中最基本的类型,一个key对应一个values,最大存储能力512M

字符串(string)操作命令
set key value 设置key的值

mset key1 value1 key2 value2 同时设置一个或多个key-value对

mset key1 value1 key2 value2 设置多个key-value,且只有当所有key都不存在时方可成功

get key 获取key的值

mget key1 key2 获取多个key的值

getset key value 修改key的值,并返回旧的值

例如:
127.0.0.1:6379> mset name1 'zhangsan' name2 'lisi'
127.0.0.1:6379> get name1
2019-11-18T10:04:45.png

127.0.0.1:6379> mget name1 name2
2019-11-18T10:04:55.png

==========================================================================

hash 哈希;键值对集合,最常用与储存对象,最大存储能力2**32-1个键值对

哈希(hash)操作命令

hset myhash key1 value1 key2 value2 创建hash

hget hashname keyname 获取哈希表中指定字段的值

hmget hashname keyname1 keyname2 批量获取哈希表中指定字段的值

hgetall hashname 获取哈希表中所有的键值对

例如:
127.0.0.1:6379> hset myhash name1 'zhangsan' name2 'lisi'
2019-11-18T10:05:08.png
127.0.0.1:6379> hget myhash name1
'zhangsan'
2019-11-18T10:04:29.png
127.0.0.1:6379> hget myhash name2
'lisi'

127.0.0.1:6379> hmget myhash name1 name2
1) 'zhangsan'
2) 'lisi'

127.0.0.1:6379> hgetall myhash
2019-11-18T10:05:38.png
1) 'zhangsan'
2) 'lisi'

==========================================================================

list 列表;字符串列表,按照插入顺序排列,最大存储能力2**32-1个元素

列表(list)操作命令

lpush list_name value 创建列表

lrange list_name n m 查看列表的n至m条数据

例如:
127.0.0.1:6379> lpush key_name values1 values2 values3 ......
127.0.0.1:6379> lrange key_name 0 0

127.0.0.1:6379> lrange key_name 0 1

==========================================================================

set 集合(无序的);字符串的无序集合,set是通过哈希表实现的,集合内的值不能重复提交,最大存储能力2**32-1个成员

集合(set)操作命令

sadd key value 创建set

smembers key1 查看set

例如:
127.0.0.1:6379> sadd set_name values1
(integer) 1
127.0.0.1:6379> sadd set_name values2
(integer) 1
127.0.0.1:6379> sadd set_name values2
(integer) 0 重复提交数据返回0,且会直接被忽略掉
127.0.0.1:6379> sadd set_name values3 values4 values5 一次设置多个值
127.0.0.1:6379> srandmember set_name 随机返回一个set中的值

127.0.0.1:6379> smembers set_name

127.0.0.1:6379> srem set_name values1 删除set中的某一个或多个值

==========================================================================

zset 有序集合;和set类似,不过该类型的值是有序排列的

有序集合(zset)操作命令

zadd key value1 创建zset

zrange value1 n m 查看有序集合指定的n至m个成员

例如:
127.0.0.1:6379> zadd zset_name 0 values1 成员前方的0表示分数,分数越低,排序时越靠前
(integer) 1
127.0.0.1:6379> zadd zset_name 0 values2
(integer) 1
127.0.0.1:6379> zadd zset_name 0 values2
(integer) 0 和set一样,无法插入重复的数据
127.0.0.1:6379> zadd zset_name 0 values3
(integer) 1
127.0.0.1:6379> zadd zset_name 0 values1 0 values2 0 values3 批量添加

127.0.0.1:6379> zrange zset_name 0 2 从第一个成员开始,打印至第二个成员

127.0.0.1:6379> zrange zset_name 0 2 withscores 显示指定范围的值,并显示每个值的分数

127.0.0.1:6379> zcard zset_name 获取集合中的成员数(查看一共有多少个值)

127.0.0.1:6379> zscan zset_name 0 获取集合中所有的值和对应的分数(0可以为任何数字)

==========================================================================

所有数据类型key的操作命令

del key 删除一个key

exists key 检查key是否存在

expire key n 给key设定过期时间n,单位s,到时间后redis将自动删除该key

pexpire key n 给key设定过期时间n,单位ms

pttl key 查看key的过期时间,单位ms

ttl key 查看key的过期时间,单位s

persist key 移除key的过期时间

rename key newkey 修改key名称,如果newkey已经存在,则key覆盖newkey的值

renamenx key newkey 修改key名称,如果newkey已经存在,则返回0,不修改

type key 查看key的类型

==========================================================================

Python客户端连接redis

安装redis-py
 1、下载:wget https://github.com/andymccurdy/redis-py/archive/master.zip

 2、安装python程序
 # yum install -y python

 3、解压:unzip master.zip
![2019-11-18T10:07:53.png][13]
 4、安装:
 # cd redis-py-master

 # python setup.py install
 
不报错即表示安装成功

如果出现以下错误:
ImportError: No module named setuptools
![2019-11-18T10:08:09.png][14]

是少了个python扩展包:
# yum install -y python-setuptools

然后重新使用:# python setup.py install安装即可

测试使用redis-py
 # python

 >>> import redis        --调用redis模块
 >>> r = redis.StrictRedis(host='127.0.0.1',port=6379,password='******');    --设置连接redis数据库

 >>> r.set('redis_py_test','test');        --设置键值对(string类型)
 
 >>> print r.get('redis_py_test');        --获取key的值
 test

2019-11-18T10:08:22.png
hash

r.hset('hash1','k1','v1');
print (r.hget('hash1','k1'));

列表

r.lpush('list1','1','2','3');
print (r.lrange ('list1','0','2'));
2019-11-18T10:08:55.png

其余类型自行测试。。。。。。

==========================================================================

redis数据持久化

数据持久化一共三种办法:

一、数据自动写入
1.appendfsync no
appendfsync为no,表示redis不会自动将内存中的临时数据写入磁盘中,全靠系统来进行数据保存,大多数linux系统默认为每30s保存一次缓冲池内的数据到磁盘

2.appendfsync everysec (redis默认数据写入级别)
该级别下,redis会每隔1秒进行一次数据写入磁盘操作,但如果某一次数据写入超过1秒,redis将会自动延迟一秒进行下一波写入操作,这一次写入不管花多长时间都会一直进行,但由于这时写入操作被占用,后面的写入操作将会被阻塞,导致部分数据无法正常写入;这种骚操作在大多数数据库中被称为“group commit”批量写入。

3.appednfsync always
该级别下,每一次写操作redis都会进行一次写入操作,这种级别下对数据的安全性是最好的,但由于写入次数过多,对性能会有一定影响

大佬们推介是直接使用默认级别就好

二、Bgrewriteaof 命令手动重写
命令格式:
127.0.0.1:6379> BGREWRITEAOF

三、快照
默认情况下,redis会开启自动快照功能,快照保存的文件为数据目录下的dump.rdb(可指定名称),自动快照促发条件可自行在配置文件中进行修改(save 900 1),或者可以执行 save 或者 bgsave 命令进行手动保存快照

快照文件将在子进程将快照文件中的内容全部写入磁盘后,重新创建一个新文件来替代老文件

==========================================================================

## redis主从配置

主:master
# vim /usr/local/redis/redis.conf
requirepass 123                将该行注释打开,并修改好自己的redis登陆密码
# bind 127.0.0.1            找到该行,并将其注释,开启允许远程访问
masterauth 123                设置master连接密码

127.0.0.1:6379> auth 123
127.0.0.1:6379> info replication
2019-11-18T10:09:20.png

从:slave
127.0.0.1:6379> info replication 查看当前redis主从属性

127.0.0.1:6379> slaveof host port 临时配置主从关系,重启后失效

2019-11-18T10:09:33.png

vim /usr/local/redis/redis.conf
slaveof host port 将host和port修改为对应的IP和端口,重启redis即可永久开启主从关系
masterauth 123 如果master有开启密码验证,需打开这行注释,并在后方添加上master指定的密码
2019-11-18T10:09:53.png

/etc/init.d/redis start

redis读写分离介绍

redis中,只要实现了主从复制关系的,就已经满足了读写分离,其中master可读写,slave只能读

主:
2019-11-18T10:10:01.png
从:

2019-11-18T10:10:08.png

在主输入信息,
127.0.0.1:6379> mset master 'slave' master1 'slave1'
在从查看:
127.0.0.1:6379> mget master master1

2019-11-18T10:10:16.png

end

Last modification:November 18th, 2019 at 06:13 pm
如果觉得我的文章对你有用,请随意赞赏