Redis 基础 一
本文主要介绍了 Redis 的简介、安装、常用命令和基础类型。
简介和安装
1. NoSQL 简介
NoSQL,泛指非关系型数据库,NoSQL数据库分四类
- 键值(key-value)存储数据库,这一类数据库会使用一个哈希表,这个表中一个特定的键和一个指针指向特定的数据,如Redis,Voldmort,Oracle BDB
- 列存储数据库,通常用来因对分布式存储的海量诗句,键仍然存在,但是它们的特点是指向多个列。如HBASE,Riak。
- 文档型数据库,数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看做是键值数据库的升级版,允许之间嵌套键值。而且文档数据库比键值数据库的查询效率更高。如:CouchDB,MongoDB。
- 图形数据库,与其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,能够扩展到过个服务器上。
NoSQL数据库没有表中的查询语言(SQL),因此进行数据查询需要定制数据模型。许多NoSQL数据库都有TEST式的数据接口或者API。如:Neo4J,InfoGrid,Infinite Graph。
2. 非关系型数据库的特点
- 数据模型比较简单
- 需要灵活性更强的IT系统
- 对数据库性能要求较高
- 不需要高度的数据一致性
- 对于给定的key,比较容易映射复杂值得环境
Redis 简介
是以key-value形式存储,data structure service 数据结构服务器。键可以包含:(String) 字符串,哈希,(list)链表,(set)集合,(zset)有序集合。这些数据集合都支持push/pop、add/remove级取交集、并集已经更复杂的操作。Redis支持各种不同的方式排序。为了保证效率,数据都是缓存在内存中,它可以周期性的把更新的数据写入磁盘或者把修改的操作追加到文件中。
- 优点
- 对数据高并发读写
- 对海量数据的高效率存储和访问
- 对数据的可扩展性和高可用性
- 缺点
- redis 无法做到太复杂的关系数据库模型
3. 一些特性
- 扩展性
- 水平扩展。在原有的主(可读可写)从(只读)服务器集群(读写分离的),横向的扩充,增加主从节点
- 垂直扩展。把原有的主从服务器上加硬件来增加容量
- 高可用:在原来的主节点挂掉时,从节点连接到其他的主节点。
- 可靠性:持久化后的数据不丢失(同步到硬盘)
- RDB: 周期性的把内存中的数据同步到硬盘上
- 只要DML操作,把持久化操作记录到日志
appendonly.aof
中(相当于Oracle中的undo的概念)。主要。
4. Redis 的三种内容解决方案
- 主从形式: 普通的一个主节点,多个从节点。当主节点挂掉的话,整个集群挂掉。
- 哨兵形式(redis 2.x):在主从的基础上增加一个哨兵节点,来监视主从节点的状态。当主节点挂掉的时候,在从节点里通过选举方式选择一个从节点来当主节点。当主节点修复,会默认变成从节点。
- 集群模式(redis 3.x):多主多从,可以做数据的分布(把数据均摊到多台机器)
5. 关于Redis的面试问题
1. Redis 慢
原因:在写入的时候,redis 使用AOF模式来维持高可用,因此要不断的记录日志。导致写慢读快(读自内存)。
解决方法:2.0时候可以调节虚拟机的参数;3.0集群后参数不可调,多加服务器;增加结合SSDB,来增加写的速度。
2. 如何综合的解决高并发问题
前端:lvs(负载兼容器) + nginx(业务拆分)
后台:数据库的分表分库 / redis缓存(提高性能,给数据库降压)
3. 业务场景
不需要实时返回数据,不需要强一致性
- 缓存(应用最多,功能是秒杀,抢购,抢红包)
- 任务队列(聊天多条消息)
- 应用排行榜
- 网站访问统计
- 投票数、微博转发,评论、浏览量
- 数据过期处理
- 分布式集群架构中的session 分离
Redis 安装和常用命令
1. Linux 系统
下载地址
安装步骤
- 首先安装 gcc,把下载好的
redis-3.0.0-rc2.tar.gz
放到 Linux/usr/local
文件夹下; - 进行解压
tar -zxvf redis-3.0.0-rc2.tar.gz
; - 进入到
redis-3.0.0
目录下,进行编译make
; - 进入到
src
下进行安装make install
,验证(查看 src 目录下,有redis-server
、redis-cli
即可); - 建立两个文件夹存放 redis 命令和配置文件。
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/bin
- 把
redis-3.0.0
下的redis.conf
移动到/usr/local/redis/etc
下。cp redis.conf /usr/local/redis/etc
- 把
redis-3.0.0/src
里的以下文件移动到bin
下。mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
- 启动时并制定配置文件=:
./redis-server /usr/local/redis/etc/redis.conf
。(注意使用后台启动,所以修改redis.conf
里的9 daemonize
改为yes
) - 验证是否启动成功
-
ps -ef | grep redis
或查看端口号netstat -tunpl | grep 6379
- 进入redis客户端
redis-cli
,退出客户端quit
- 退出redis服务
pkill redis-server
,或kill进程号,或/usr/local/redis/bin/redis cli shutdown
-
安装命令补充
-
linux yum rz
安装(使可以上传下载文件):sudo yum install lrzsz -y
- 上传文件
rz
(sc
: 下载文件) - gcc 安装:
sudo yum install gcc-c++
- 进入redis加压后的文件夹,执行
make
,报错的话执行make MALLOC=libc
- 启动redis服务器:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
;启动客户端/usr/local/redis/bin/redis-cli
- 格式解压
.tar.gz 格式解压为 tar -zxvf xx.tar.gz
.tar.bz2 格式解压为 tar -jxvf xx.tar.bz2
2. Mac 系统
使用Homebrew
安装 Redis
安装命令
brew install redis
安装完成后的提示信息
To have launchd start redis at login:
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
Then to load redis now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or, if you don’t want/need launchctl, you can just run:
redis-server /usr/local/etc/redis.conf
3. 常用命令
开机启动 Redis 命令
$ ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
检查服务是否启动
$ redis-cli ping 返回 PONG 启动
$ ps aux | grep redis // 查看redis进程
使用配置文件启动 Redis 命令
$ redis-server /usr/local/etc/redis.conf
或 $ redis-server
另 $ redis-server & // 后台程序式运行
停止 Redis 服务
$ redis-cli shutdown
// Redis收到命令后,服务端会断开所有客户端的连接,然后根据配置执行持久化,最后退出
启动客户端
// 1. 按照默认配置连接Redis(127.0.0.1:6379)
$ redis-cli
// 2. 指定地址和端口号
redis-cli -h 127.0.0.1 -p 6379
停止客户端
ctrl + c 或 quit
redis 配置文件的位置
/usr/local/etc/redis.conf
卸载redis和它的文件
brewuninstall redis rm ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
4. 其他命令
-- 修改为守护模式
daemonize yes
-- 设置进程锁文件
pidfile /usr/local/redis/redis.pid
-- 端口
port 6379
-- 客户端超时时间
timeout 300
-- 日志级别
loglevel debug
-- 日志文件位置
logfile /usr/local/redis/log-redis.log
-- 设置数据库的数量,默认数据库为16,可以使用SELECT 命令在连接上指定数据库id
databases 16
-- 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
-- save
-- Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
-- 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,
-- 可以关闭该#选项,但会导致数据库文件变的巨大
rdbcompression yes
-- 指定本地数据库文件名
dbfilename dump.rdb
-- 指定本地数据库路径
dir /usr/local/redis/db/
-- 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能
-- 会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有
-- 的数据会在一段时间内只存在于内存中
appendonly no
-- 指定更新日志条件,共有3个可选值:
-- no:表示等操作系统进行数据缓存同步到磁盘(快)
-- always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
-- everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
Redis 基础类型讲解
redis 一共5种基本数据类型: String、Hash、List、Set、ZSet
-
flushdb
,直接清空
1. String 类型
String 类型是包含很多种类型的特殊类型,并且是二进制安全的。比如序列化对象进行存储,比如一张二进制图片进行二进制存储,比如一个简单的字符串、数值等。
- 设置值
set name zcq
- 取值
get name
(设置name多次会覆盖) - 删除值
del name
-
setnx(not exist) name
: 如果不存在进行设置,就不需要设置了,返回零 -
setex(expired)
,setex color 10 red
设置color的有效期为10秒,10秒后返回nil(redis中nil表示空) - 使用
setrange
替换字符串set email 123456789@qq.com
-
setrange email 10 ww
(表示从第10位开始替换,后面跟上替换的字符串)
- mset 、mget 一次性设置和获取多个值
mset k1 v1 k2 v2
mget k1 k2
- 一次性设置和取值
getset
方法- getset key value
-
incr
和decr
方法: 对某一值进行递增和递减incr int_a
-
incrby
和decrby
方法: 对某个值进行指定长度的递增和递减incrby int_a 4
-
append key value
: 为某个值追加方法append name chuanqiang
-
strlen key
获取字符串的长度
2. Hash 类型
Hash 类型是 String 类型的 field 和 value 的映射,或者说一个 String 几何,适合存储对象,会比把一个对象类型存储到String 中更减少空间,并方便存储整个对象。
-
hset myhash field1 hello
存储值 -
hget myhash field1
获取内容 -
hmset myhash field1 v1 field v2
批量存储多个键值对 -
hmget myhash field1 field2
批量获取键值对 -
hincrby
、hdecrby
几何递增和递减 -
hexists
是否存在 key,如果存在返回,不存在返回 0 -
hlen
返回 Hash 集合里所有的键数值 -
hdel
删除指定 hash 里所有的字段 -
hkeys
返回 Hash 里所有的字段 -
hvals
返回 Hash 的所有 value -
hgetall
返回 Hash 里所有的 key 和 value
3. List 类型
List 类型是一个链表结构的集合,其主要功能有 push
、pop
、获取元素等。List类是一个双端链表结构。我们可以进行集合的头部和尾部添加或删除元素。List 可以作为栈,又可以作为队列。
-
lpush
: 从头部加入元素(栈),先进后出lpush list1 "hello"; lpush list1 "world"
-
lrange list1 0 -1
: 表示从头取到尾。结果是world hello
-
rpush
: 从尾部加入元素(队列),先进先出rpush list2 "one; rpush list2"
-
lrange list2 0 -1
结果是hello world
-
linsert
方法: 插入元素linsert list3 before[集合的元素][插入的元素]
- 如
linsert list2 before "world" "hi"
,结果是hello hi world
-
lset
方法: 将指定下标的元素替换掉-
lset list1 0 "aaa"
,把list1 的第一个数据替换为 aaa
-
-
lrem
方法: 删除元素,返回删除的个数-
lrem list1 2 aaa
,删除两个 aaa
-
-
ltrim
方法: 保留指定 key 的值范围内的数据- eg
ltrim list1 1 5
,保留第2到第6的值,删除第一个值
- eg
-
lpop
: 从list 的头部删除元素,并返回删除元素lpop list1
-
rpop
: 从list 的尾部删除元素,并返回删除元素rpop list1
-
rpoplpush
: 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 -
lindex
: 通过索引获取列表中的元素。也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 -
llen
: 返回元素的个数
4. Set 类型和 Zset 类型
set 集合是 String 类型的无序集合,set 是通过hashtable
实现的,对集合我们可以取交集、并集、差集。
set 类型
-
sadd set1 name
: 向集合中添加元素。 -
smembers set:
查看set集合中的元素 -
srem set name
: 删除set中name元素 -
spop set:
随机返回删除的key -
sdiff set1 set2:
返回两个集合的不同元素(以前面的集合为标准) -
sdiffstore set3 set1 set2
: 将返回的不同元素存储到set3中 -
sinter set1 set2
: 返回集合的交集 -
sinterstroe set3 set1 set2
: 返回交集结果,存储到set3中 -
sunion set1 set2
: 取并集 -
sunionstore set3 set1 set2
: 取并集,存到set3中 -
smove set1 set2 a
: 将set1中的元素移动到set2中去 -
scard set
: 查看集合里面的元素个数 -
sismember set name
: 判断某元素是否为集合中的元素。返回1代表是,0代表否 -
srandmember set
: 随机返回一个元素
zset 类型
-
zadd
向有序集合中添加一个元素,该元素如果存在,则更新顺序。
zadd zset1 3 five;
zadd zset1 1 one;
zadd zset1 2 two;
zrange zset1 0 -1 withscores; -- 展示所有元素
zset可以做搜索排行
-
zrem zset1 one
: 删除名称为key的zset中的元素 -
zincrby
: 以指定去自动递增或减少 -
zrangebyscore
: 找到指定区间范围的拘束进行返回 -
zremrangebyrank
: 只删除索引1 -
zremrangebyscore
: 删除指定序列号 -
zrank zset1 three
: 升序排序后再找到索引值返回 -
zrevrank zset1 tow
: 降序排序后再找到索引值返回 -
zrangebyscore zset1 2 3 withscores
: 找到指定区间范围的数据尽兴返回 -
zcard zset
: 返回集合里所有的元素个数 -
zcount zset1 1 4
: 返回集合中给定区间中的数量 -
zremrangebyrank zset1 0 1
:删除索引从0到1的元素 - [x]
zremrangebyscore zset1 5 5
: 删除指定序号
Redis 高级命令
1. Redis高级命令及特性
-
keys *
: 返回满足的所有键(可以模糊匹配) -
exists key
: 是否存在指定的key -
expire name 5
: 设置过期时间 -
persist name
: 取消过期时间 -
move name 1
: 将当前数据库中的key转移到其他数据库中 -
randomkey
: 随机返回数据库的一个key -
rename
: 重命名key -
echo
: 打印命令 -
dbsize
: 查看数据库的key数量 -
info
: 获取数据库的信息 -
config get
: 实时存储收到的请求(返回相关的配置信息-
config get *
: 返回所有配置(其实就是redis.config的缩影)
-
-
flushdb
: 清空当前数据库 -
flushall
: 清空所有数据库
redis 分为16个数据库,单只是逻辑上的概念,不是物理上的划分
2. Redis 的安全性
因为Redis的速度相当快,一个外部用户1秒内可以进行15w次的密码尝试,这意味着需要设定非常强大的密码来防止暴力破解。
vi
编辑redis.conf
文件,找到下面进行保存修改
#requirepass foobared
requirepass ****
重启服务器pkill redis-server
,再次进入keys *
,会发型没有权限进行查询(erro)NOAUTH Authentication required
。输入密码则能成功进入auth bhz
。
每次进入的时候都需要输入密码,有种简单的方式直接登录授权:#/usr/local/redis/bin/redis-cli -a bhz
3. 主从复制
主从复制
- 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<masterip><mastport>
- 第二部,
masterauth<master-password>
使用info
查看 role 角色即可知道是主服务或从服务
- 第一步,
克隆服务器
- 关掉当前的虚拟机
- VMware 在当前服务器上右键『管理』--『克隆』-- 『下一步,下一步』--『创建完整克隆』
- 克隆出的新服务的『网络适配器』--右边的『高级』--『确定』
设置IP
# ifconfig eth0 192.168.149.129 netmask 255.255.255.0
其他方式资料参考
- 更新时间:2018.01.29