搭建redis
1、以源码包为例:将redis源码安装包上传至服务器
2、解压 tar –zxvf 源码包
3、进入解压后的文件进中,make进行编译,编译成可执行的程序(make需要安装gcc,不然编译会报错:缺少gcc)
4、编译后,进入src文件夹中进行make install
5、建立两个文件夹存放redis命令和配置文件(etc和bin文件夹)
6、将解压包下的redis.conf文件移动到etc文件夹下
7、将src下的mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-check-rdb、redis-cli、redis-server文件移动到bin文件夹下
8、前台启动redis
9、设置后台启动
修改etc文件夹下的配置文件redis.conf,改成yes
小技巧:在vim编辑器模式下查找字符串
vim +/字符串 需要编辑的文件路径(这种方式被查找字符串会高亮显示)
或者
在vim模式下进行:/需要查找的字符串
10、后台启动(以配置文件的方式启动),查看进程
11、启动客户端进行数据操作
12、退出服务器端
redis一共分为五种基本数据类型:String、Hash、List、Set、Zset
String类型是包含很多种类型的特殊类型,并且是二进制安全的。比如序列化的对象进行存储,比如一张图片进行二进制存储,比如一个简单的字符串,数值等等。
set和get方法
设置值:set name bhz
获取值:get name (设置name 多次会覆盖)
删除值:del name
使用setnx(no exist)
name 如果不存在进行设置,存在就不需要进行设置了,返回0
使用setex(expired)
setex color 10 red 设置color的有效期为10秒,10秒后返回nil(在redis里nil表示空)
使用setrange替换字符串
set email [email protected]
setrange email 10 ww(10表示从第几位开始替换,后面跟上替换的字符串)
使用一次性设置多个和获取多个值得mset、mget方法:
mset key1 bhz key2 bai key3 28;对应的mget key1 key2 key3方法对应的也有msetnx和mget方法。
一次性设置和取值的getset方法:
set key4 cc
getset key4 changchun 返回旧值并设置新值得方法。
incr和decr方法:对某一个值进行递增和递减
incrby和decrby方法:对某个值进行指定长度的递增和递减
append [name]方法:字符串追加方法
strlen [name]方法:获取字符串的长度
Redis是单线程的
Hash类型是String类型的field和value的映射表,或者说一个String集合。它的特点是适合存储对象,相比较而言,将一个对象类型存储在Hash类型里要比存储在String类型里占用更少的内存空间,并方便存取整个对象。
形如:hset myhash field1 hello(含义是hset是hash集合,myhash是集合名字,field1是字段名 hello是其值)使用hget myhash field1 获取内容,也可以存储多个值,hmset可以进行批量存储多个键值对:hmset myhash sex nan addr beijing,可同样也有hsetnx,和setnx大同小异。
hincrby和hdecrby:集合递增和递减
hexists:是否存在key,如果存在返回,不存在返回0
hlen:返回hash集合里的所有的键值对
hdel:删除指定hash的field
hkeys:返回hash里所有的字段
hvals:返回hash的所有value
hgetall:返回hash里所有的key和value
List数据类型
List类型是一个链表结构的集合,其主要功能有push、pop、获取元素等。更详细的说,List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,list的设计非常简单精巧,即可以作为栈,又可以作为队列。满足绝大多数需求。
lpush方法:从头部加入元素(栈)先进先出
形如:lpush list1 "hello" lpush list1 "world"
lrange list1 0 -1(表示从头取到末尾)
rpush方法:从尾部加入元素(队列)先进先出
形如:rpush list2 "beijing" rpush list2 "sxt"
lrange list2 0 -1
linsert方法:插入元素
形如:linsert list3 before [集合的元素] [插入的元素]
Set数据类型
set集合是string类型的无序集合,set是通过hashtable实现的,对集合我们可以取交集、并集、差集。
sadd方法:向名称为key的set中添加元素
小结:set集合不允许重复元素,smembers查看set集合的元素
srem方法:删除set集合元素
spop方法:随机返回删除的key
sdiff方法:返回两个集合的不同元素(哪个集合在前面就以哪个集合为标准)
sdiffstore方法:将返回不同元素存储到另外一个集合里
小结:这里把set1和set2的不同元素(以set1为准)存储到set3集合里
Redis高级命令和特性
keys *:返回满足的所有键(可以模糊匹配)
exists:是否存在指定的key
expire:设置某个key的过期时间,使用ttl查看剩余时间
persist:取消过期时间
select [数据库下标]:数据库为0到15(一共16个数据库)默认进入的是0数据库
move [key] [数据库下标]:将当前数据库中的key,转移到其他数据库中
randomkey:随机返回数据库里的一个key
rename:重命名key
echo:打印命令
dbsize:查看数据库的key数量
info:获取数据库信息
config get:实时传储收到的请求(返回相关的配置信息)
flushdb:清空当前数据库
flushall:清空所有数据库
Redis的安全性
因为redis速度非常快,所以在一台比较好的服务器下,一个外部用户在一秒内可以进行15w次的密码尝试,这意味着你需要设定非常强大的密码来防止暴力破解。
主从复制
主从复制:
- Master可以拥有多个slave
- 多个slave可以连接同一个master外,还可以连接到其他的slave
- 主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
- 提供系统的伸缩性
主从复制的过程:
- slave与master建立连接,发送sync同步命令
- master会开启一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存
- 后台完成保存后,就将文件发送给slave
- slave将此文件保存到磁盘上
主从复制配置:
clone服务器之后修改slave的IP地址
修改配置文件:/usr/local/redis/etc/redis.conf
第一步:slaveof
第二步:masterauth
使用info查看role角色即可知道是主服务或从服务。
小故事:
Disruptor说的是生产者和消费者的故事,有一个数组,生产者往里面扔芝麻,消费者从里面捡芝麻。但是扔芝麻和捡芝麻也要考虑速度的问题。1、消费者捡的比扔的快,那么消费者要停下来,生产者扔了新的芝麻,然后消费者继续。2、数组的长度是有限的,生产者到末尾的时候会再从数组的开始位置继续,这个时候可能会追上消费者,消费者还没从那个地方捡走芝麻,这个时候生产者要等待消费者捡走芝麻,然后继续。
有两台redis服务器,其中把125的机器配置成124的从节点,只需要修改125的redis.conf文件进行设置。(非常简单)
查看当前redis客户端的主从角色
当设置后进行info查看,如果角色没变,需要重启机器。
当125和124的机器实现了主从复制后,那么在124的主服务器中写入数据,那么125的从服务器中就会读到,但是无法在125的机器中写数据,因为是从服务器,只能读取。
===========================================================
问题:主从配置后,从服务器无法同步数据
解决方法:1.关闭主从两台服务器的防火墙
2.设置主服务器的redis.conf文件,将bind修改为 0.0.0.0,或者注释掉
3.如果主服务器设置了登录密码,那么从服务器就需要在redis.conf文件中,配置登录密码,否则无法同步数据。
4.一定要开启主服务器!!!
小技巧:全局替换字符串 %s/需要替换的字符串/替换成别的字符串/g