1.redis概述

官网网站:https://redis.io

中文网:http://www.redis.cn

redis是一款高性能的NoSQL系列的非关系型数据库。

是一个开源的,使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

NoSQL=Not Only SQL(不仅仅是SQL)

泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。

NoSQL的代表:MongoDB、Redis、Memcache

关系型数据库与NoSQL的区别?

RDBMS

  • 高度组织化结构化数据

  • 结构化查询语言(SQL)

  • 数据和关系都存储在单独的表中

  • 数据操纵语言,数据定义语言

  • 严格的一致性

  • 基础事务

  • ACID

NoSQL

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式
  • 键 - 值对存储、列存储、文档存储、图形数据库
  • 最终一致性,而非ACID属性
  • 非结构化和不可预知的数据
  • CAP定理
  • 高性能,高可用性和可伸缩性

redis的应用场景

  • 缓存(数据查询、短连接)

  • 任务队列(秒杀、抢购)

  • 应用排行榜

  • 网站访问统计

  • 数据过期处理(可精确到毫秒)

  • 分布式集群架构中的session分离

2.redis环境搭建(linux)

2.1 redis预备环境

2.2 redis安装

  1. 解压redis-x.x.xx.tar.gz到指定目录(tar zxvf redis-x.x.xx.tar.gz -C /xxx/xxx/..)
  2. cd redis-x.x.xx.tar.gz
  3. make
  4. make install
  5. 查看默认安装目录:/usr/local/bin
  6. 启动(redis-server)
  7. 客户端连接(redis-cli -p 6379)
  8. 输入ping

2.3 redis自定义配置

redis启动时,会自动加载redis.conf文件,配置文件是可以进行自定义配置的。

  1. cp redis-x.x.xx/redis.conf /path/redis.conf
  2. /usr/local/bin/redis-server /path/redis.conf

3.redis基础知识

3.1 单进程

redis是通过单进程模型来处理客户端的请求。

对读写等事件的响应是通过epoll函数的包装来做到的。

redis的实际处理速度完全依靠主进程的执行速度。

epoll

epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

3.2 默认数据库

redis默认有16个数据库,类似数组索引从零开始,初始默认使用零号库。

redis.conf

1
2
3
4
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16

数据库切换

3.3 查看当前数据库key数量

dbsize

keys *

通常并不推荐直接使用keys *

3.4 FLUSH

flushdb 清空当前数据库

flushall 清空所有数据库(慎用)

4.redis数据类型

image-20190507195647154

redis常用的五大数据类型

  • String(字符串)
  • Hash(哈希)
  • List(列表)
  • Set(集合)
  • Zset(有序集合)

4.1 String(字符串)

string是redis中最基本的数据类型,一个key对应一个value。

string类型是二进制安全的,意味着redis的string可以包含任何数据,比如图片、序列化对象。

一个字符的value最大为512M。

4.2 Hash(哈希)

redis中的hash,类似java中的map。

redis的hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

类似java中的Map<String, Object>

4.3 List(列表)

redis列表是一个简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或尾部(右边)。

它的底层实际是个链表。

4.4 Set(集合)

redis的set是string类型的无序集合,它是通过HashTable实现的。

4.5 Zset(有序集合)

redis的zset和set一样,都是string类型元素的集合,且不允许重复。

每一个元素都会关联一个double类型的score(分数)

redis正是通过分数来为集合中的元素进行从小到大的排序,zset的元素是唯一的,但score可以重复。

5.redis常用指令

redis指令参考手册:http://doc.redisfans.com

5.1 Key相关指令

指令 操作 说明
del del key 删除指定的key-value
exists exists key 判断某个key是否存在
expire expire key second 指定key的过期时间,单位为秒
keys keys * 显示所有的key
move move key db 将key移动到某个库
ttl ttl key 查看key的过期时间,-1表示永不过期,-2表示已过期
type type ke 查看key的类型

5.2 String相关指令

基本操作

指令 操作 说明
set set key value 添加key-value
get get key 获取key对应的value
append append key value 不存在则新增,存在则在value末尾追加
strlen strlen key 返回key对应value的字符串长度

数值操作

指令 操作 说明
incr incr key 将key对应的value加1,不存在则创建并初始化为0,再执行incr操作
incrby incrby key number 将key对应的value加number,不存在则创建并初始化为0,再执行incrby操作
decr decr key 将key对应的value减1,不存在则创建并初始化为0,再执行decr操作
decrby decrby key number 将key对应的value减number,不存在则创建并初始化为0,再执行decrby操作

其他操作

指令 操作 说明
getrange getrange key start end 返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end在内)
setrange setrange key offset value 用 value参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset开始。不存在的key当作空白字符串处理。
setex set key second value 将值 value关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。如果 key 已经存在,setex 命令将覆写旧值。
setnx setnx key value 将 key 的值设为 value,当且仅当 key 不存在。若给定的 key 已经存在,则 setnx 不做任何动作。
mset mset key value [key value ….] 同时设置一个或多个 key-value 对。如果某个给定 key 已经存在,那么 mset 会用新值覆盖原来的旧值
mget mget key [key …] 返回所有(一个或多个)给定 key 的值。如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。
msetnx msetnx key value [key value …] 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
getset getset key value 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

5.3 List相关指令

指令 操作 说明
lpush lpush key value [value …] 将一个或多个值 value 插入到列表 key 的表头。如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头。如果 key 不存在,一个空列表会被创建并执行lpush操作。
rpush rpush key value [value …] 将一个或多个值 value 插入到列表 key 的表尾。如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾。如果 key 不存在,一个空列表会被创建并执行rpush操作。
lrange lrange key start end 返回列表 key 中指定区间内的元素,区间以偏移量 startstop 指定。超出范围的下标值不会引起错误。
lindex lindex key index 返回列表 key 中,下标为 index 的元素。
llen llen key 返回列表 key 的长度。如果 key 不存在,则 key 被解释为一个空列表,返回 0 。如果 key 不是列表类型,返回一个错误。
lrem lrem key count value 根据参数 count 的值,移除列表中与参数 value 相等的元素。
ltrim ltrim key start end 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
rpoplpush rpoplpush source destination 将列表 source 中的最后一个元素(尾元素)弹出,将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
lset lset key index value 将列表 key 下标为 index 的元素的值设置为 value 。当 index 参数超出范围,或对一个空列表( key 不存在)进行 lset 时,返回一个错误。
linsert linsert key before|after pivot value 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。当 pivot 不存在于列表 key 时,不执行任何操作。

注:由于redis的List(列表)是一个双向链表,因此适用于链表首尾的元素操作,对中间元素操作效率较低。

5.4 Set相关指令

指令 操作 说明
sadd sadd key member [member …] 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
smembers smembers key 返回集合 key 中的所有成员。
sismember sismember key member 判断 member 元素是否集合 key 的成员。
scard scard key 返回集合 key 的基数(集合中元素的数量)。
srem srem key member [member …] 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略
srandmember srandmember key [count] 如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。如果添加count参数,则返回count个随机元素
spop spop key 移除并返回集合中的一个随机元素。
smove smove source destination member member 元素从 source 集合移动到 destination 集合。
sdiff sdiff key [key …] 返回一个集合的全部成员,该集合是所有给定集合之间的差集。
sinter sinter key [key …] 返回一个集合的全部成员,该集合是所有给定集合的交集。当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
sunion sunion key [key …] 返回一个集合的全部成员,该集合是所有给定集合的并集。

5.4 Hash相关指令

注:redis中的hash,KV模式不变,但V是一个键值对。

指令 操作 说明
hset hset key field value 将哈希表 key 中的域 field 的值设为 value 。如果 key 不存在,一个新的哈希表被创建并进行hset操作。如果域 field 已经存在于哈希表中,旧值将被覆盖。
hget hget key field 返回哈希表 key 中给定域 field 的值。
hmset hmset key field value [field value …] 同时将多个 field-value (域-值)对设置到哈希表 key 中。此命令会覆盖哈希表中已存在的域。
hmget hmget key field [field …] 返回哈希表 key 中,一个或多个给定域的值。
hgetall hgetall key 返回哈希表 key 中,所有的域和值。在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
hdel hdel key field [field …] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
hlen hlen key 返回哈希表 key 中域的数量。
hexists hexists key field 查看哈希表 key 中,给定域 field 是否存在。
hkeys hkeys key 返回哈希表 key 中的所有域。
hvals hvals key 返回哈希表 key 中所有域的值。
hincrby hincreby key field increment 为哈希表 key 中的域 field 的值加上增量 increment 。增量也可以为负数,相当于对给定域进行减法操作。
hincrbyfloat hincrbyfloat key field increment 为哈希表 key 中的域 field 加上浮点数增量 increment
hsetnx hsetnx key field value 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在。若域 field 已经存在,该操作无效。

5.5 Zset相关指令

指令 操作 说明
zadd zadd key score member [[score member] [score member] …] 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。如果某个 member 已经是有序集的成员,那么更新这个 memberscore 值。
zrange zrange key start end [withscores] 返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递增(从小到大)来排序。
zrangebyscore zrangebyscore key min max [withscores] [LIMIT offset count] 返回有序集 key 中,所有 score 值介于 minmax 之间(包括等于 minmax )的成员。有序集成员按 score 值递增(从小到大)次序排列。
zrem zrem key member [member …] 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
zcard zcard key 返回有序集 key 的基数。
zcount zcount key min max 返回有序集 key 中, score 值在 minmax 之间(默认包括 score 值等于 minmax )的成员的数量。
zrevrank zrevrank key member 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序
zrevrange zrevrange key start end [withscores] 返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小)来排列。
zrevrangebyscore zrevrangebyscore 返回有序集 key 中, score 值介于 maxmin 之间(默认包括等于 maxmin )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。