Redis初体验
一、Redis简介
REmote DIctionary Server(Redis) 是一个开源的,基于 key-value键值对的持久化的非关系型数据库存储系统。
它支持的数据存储类型包括:字符串 (String), 哈希 (Map), 列表 (list), 集合 (sets) 和 有序集合(sorted sets) 等。
在实际项目中可以用 Redis 做缓存或消息服务器,Redis 也是目前互联网中使用比较广泛的非关系型数据库。
Redis 是一个速度非常快的非关系数据库(Non-Relational Database),它可以存储键(Key)与 5 种不同类型的值(Value)之间的映射(Mapping),可以将存储在内存的键值对数据持久化到硬盘,可以使用复制特性来扩展读性能,还可以使用客户端分片来扩展写性能。
为了满足高性能,Redis 采用内存(in-memory)数据集(Dataset),根据使用场景,可以通过每隔一段时间转储数据集到磁盘,或者追加每条命令到日志来持久化。持久化也可以被禁用,如果你只是需要一个功能丰富、网络化的内存缓存。
Redis 官方网站:redis官网
1. Redis特点
数据模型
Redis 数据模型不仅与关系数据库管理系统(RDBMS)不同,也不同于任何简单的 NoSQL 键-值数据存储。Redis 数据类型类似于编程语言的基础数据类型,因此开发人员感觉很自然,每个数据类型都支持适用于其类型的操作,受支持的数据类型包括:
- String(字符串)
- Hash(哈希)
- List(列表)
- Set(集合)
- Zset(Sorted Set:有序集合)
关键优势
Redis 的优势包括它的速度、对富数据类型的支持、操作的原子性,以及通用性:
- 性能极高,它每秒可执行约 100,000 个 Set 以及约 100,000 个 Get 操作;
- 丰富的数据类型,Redis 对大多数开发人员已知的大多数数据类型提供了原生支持,这使得各种问题得以轻松解决;
- 原子性,因为所有 Redis 操作都是原子性的,所以多个客户端会并发地访问一个 Redis 服务器,获取相同的更新值;
- 丰富的特性,Redis 是一个多效用工具,有非常多的应用场景,包括缓存、消息队列(Redis 原生支持发布/订阅)、短期应用程序数据(比如 Web 会话、Web 页面命中计数)等。
2. Redis的缺陷与陷阱
内存管理开销大(不要超过物理内存的 3/5)。buffer io 可能会造成系统内存溢出(OOM-Out of Memory)
3. Redis的应用场景
- 新浪(sina)使用 redis:
- 应用程序直接访问 Redis
- Redis 当做内存,先访问 redis,redis 没有数据或访问失败时访问 MySql
- 二次开发后实现 MySql 和 Redis 互相同步
- MySql 数据通过 RBR 解析 BINLOG 同步到 redis 中实现关系型数据转变成队列数据
- Redis 提供特定数据的读写,通过 replication 接口同时写入到 MySql
二、Redis 安装
本笔记中,我们选择在 VMvare 虚拟机中安装 Redis(CentOS 7)。如果您有自己的阿里云服务器,也可以在阿里云中安装。只要能 Ping 的通云主机或者虚拟机的 IP,并在虚拟机或者云主机中放行对应的端口(或者关掉防火墙)即可访问 Redis。
下面来介绍一下 Redis 的安装过程。
1. 安装gcc编译环境
安装 Redis 时需要编译,我们要事先安装好 gcc 编译,命名如下所示。阿里云主机已经默认安装了 gcc,就无需这一步。
yum install gcc-c++
2. 下载 Redis
下载地址:Redis 版本下载
有两种方式下载安装包,一种是到官网上下载,并将安装包拷贝到 Centos 中,另一种方法是直接使用 wget 下载:
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
如果没有安装过 wget,可以通过如下命令安装:yum install wget
3. 解压安装
解压安装包:
tar -vzxf redis-3.2.8.tar.gz
将解压的文件夹 redis-3.2.8 放到 /usr/local/ 目录下(一般安装软件都会放在 /usr/local 下)。之后进入 /usr/local/redis-3.2.8/ 文件夹下,执行 make 命令即可完成安装。
如果 make 命令执行失败,可尝试如下命令:
make MALLOC=libc
make install
4. 修改配置文件
安装成功之后,需要修改一下配置文件,包括允许接入的 IP 、允许后台执行、设置密码等等。
打开 Redis 配置文件:vim redis.conf
,在命令模式下输入 /bind 查找 bind 配置,按 n 查找下一个,找到配置后,将 bind 配置成 0.0.0.0,允许任意服务器访问 Redis,即:
bind 0.0.0.0
使用同样的方法,将 daemonize 改成 yes(默认为 no),允许 Redis 在后台执行。
将 requirepass 注释打开,并设置密码为 123456(密码自己设置)。
5. 启动 Redis
在 Redis-3.2.8 目录下,指定刚刚修改好的配置文件 redis.conf 来启动 Redis :
./redis-server
./redis-server ${redis.conf}
./redis-server --port ${port}
-- 后台启动
./redis-server &
再启动 Redis 客户端:
./redis-cli
./redis-cli -p ${port}
./redis-cli -h ${ip}
./redis-cli -a ${password}
./redis-cli -p ${port} -h ${ip} -a ${password}
二、Redis 基础命令
1. Redis 基础配置命令
info
查看redis基础信息select ${database}
切换使用databaseflushdb
清除当前database的keyflushall
清除所有database的keydbsize
当前database的key的sizekeys *
查看当前database的key内容save
保存keyquit
退出
2. Redis 键命令
keys *
del ${key}
exists ${key}
ttl ${key}
查看当前key的剩余生存时间expire ${key} ${time}
设置当前key的过期时间type ${key} 查看key值的数据类型
randomkey
随机keyrename
重命名keyrenamenx
重命名key(先校验后操作)
3. Rdis 数据结构
3.1 字符串String
set ${key} ${value}
setex ${key} ${time} ${value}
添加key-value并且设置过期时间(单位秒)psetex ${key} ${time} ${value}
添加key-value并且设置过期时间(单位毫秒)get ${key}
getrange ${key} ${start} ${end}
获取指定key的指定范围的值getset ${key} ${newvalue}
重新设置key值并且返回原key值mset ${key} ${value} ...
同时设置多个key-valuemget ${key} ${key}...
获取多个key值setnx ${key} ${value}
当且只有key不存在时,设置key-value成功msetnx ${key} ${value} ...
strlen ${key}
获取key值的长度incr ${key}
数值型key自增incrby ${key} ${stepsize}
指定步长的数值型key自增decr ${key}
数值型key自减decrby ${key} ${stepsize}
指定步长的数值型key自减append ${key} ${value}
3.2 哈希Hash
hset ${obj} ${key} ${value}
设置hash值hexists ${obj} ${key}
hget ${obj} ${key}
hgetall ${obj}
获取hash对象所有的key-valuehkeys ${obj}
获取hash对象所有的keyhvals ${obj}
获取hash对象所有的valuehlen ${obj}
获取hash对象中key的数量hmget ${obj} ${key} ${key}...
hmset ${obj} ${key} ${value}...
hdel ${obj} ${key} ${key}...
删除指定hash中的key-valuehsetnx ${obj} ${key} ${value}
3.2 列表List
lpush ${list} ${element} ${element} ...
llen ${list}
返回列表list的元素数量lrange ${list} ${start} ${end}
获取list中指定范围的值lset ${list} ${index} ${value}
设置指定角标的list值lindex ${list} ${value}
获取指定value值的角标lpop ${list}
移除指定list的最左边一个元素并返回rpop ${list}
移除指定list的最右边一个元素并返回
3.3 无序集合Set
sadd ${set} ${element} ${element} ...
scard ${set}
返回集合set的元素数量smembers ${set}
查看集合set的元素内容sdiff ${set1} ${set2}
返回set1与set2的差集sinter ${set1} ${set2}
返回set1与set2的交集sunion ${set1} ${set2}
返回set1与set2的并集srandmember ${set} ${num}
返回集合中一个或多个随机元素sismember ${set} ${element}
判断元素是否在指定集合中存在srem ${set} ${element} ${element} ...
移除指定集合中的元素spop ${set}
移除指定集合中的元素并且返回移除的一个随机元素
3.4 有序集合ZSet
zadd ${zset} ${score} ${ele} ...
zcard ${zset}
查看zset中的元素个数zscore ${zset} ${ele}
查看指定元素的排序分数zcount ${zset} ${score~}
指定区间分数,返回zset中符合区间的元素zrank ${zset} ${ele}
返回zset集合中指定元素的索引zincrby ${zset} ${step-score} ${ele}
增加指定元素的scorezrange ${zset} ${start} ${end}
获取集合中指定范围的元素zrange ${zset} ${start} ${end} withscores
获取集合中指定范围的元素并显示元素相应得分