一、Redis介绍
1.1 什么是NoSQL
- 为了解决高并发,高扩展,高可用,大数据存储问题而产生的数据库解决方案,就是NoSQL数据库。
- Nosql泛指的就是非关系型数据库,Nosql即not-only-sql,它可以作为关系型数据库的良好补充。
1.2 NoSQL数据库分类
- 键值(key-value)存储数据库
- 相关的产品:Tokyo cabinet/Tyrant、Redis、Voldement、BerkeleyDB
- 典型应用:内容缓存,主要用于处理大量数据的高访问负载
- 数据模型:一系列键值对
- 优势:快速查询
- 劣势:存储的数据缺少结构化
- 列存储数据库
- 相关产品:Cassandra、HBase、Rick
- 典型应用:分布式的文件系统
- 数据模型:以列簇式存储,将同一列数据存在一起
- 优势:查找数据快,可扩展性强,更容易进行分布式扩展
- 劣势:功能相对局限
- 文档数据库
- 相关产品:CouchDB、MongoDB
- 典型应用:Web应用(与key-value类似,value是结构化的)
- 数据模型:一系列键值对
- 优势:数据结构要求不严格
- 劣势:查询性能不高,而且缺乏统一的查询语法
- 图形(Graph)数据库
- 相关产品:Neo4j、infoGrid、infinite Graph
- 典型应用:社交网络
- 数据模型:图结构
- 优势:利用图结构相关算法
- 劣势:需要对整个图计算才能得出结果,不容易做出分布式的集群方案
1.3 什么是Redis
- redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。他通过提供多种键值对数据类型来适应不同场景下的需求,目前为止redis支持的键值数据类型如:字符串类型、散列类型、列表类型、集合类型、有序集合类型
1.4 Redis使用场景
- 缓存(数据查询、短链接、新闻内容、商品内容等等)(使用最多)
- 分布式集群架构中的session分离
- 聊天室的在线好友列表
- 任务队列(秒杀、抢购、12306)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒)
二、Redis的数据结构有五种
2.1.String
2.1.1 数据结构
long len byte数组长度
long free 可用数组长度
char buff[] 数据内容
2.1.2 命令
键值:设置值通过字符串名
set:设置键值
setnx(set not exist):设置键值|若键不存在则可以存,否则返回0.
setex(set expire):设置键值(含过期时间),set key seconeds value
setrange:设置指定位置key的键值 例如setrange name diaodiao 2 haha-->dihahaao 从第二个位置开始替换
mset:设置多个键值
msetnx:设置多个不存在的键值
get:通过键获得值
getset:先通过键获得值,再设置值。
getrange(0~-1):获取指定范围的字符。范围|从左往右数从0开始 从右往左数-1开始。例如hello(0~4|-5~-1)
mget:获得多个键的值。
数字类型相关操作
set age 10(以下操作都是针对10操作)
incr 递增1 incr age-->11
incrby 递增指定数字-->incr age 5->16
decr 递减1
decrby 递减指定值
字符属性操作
set name "hello"
append:在尾部追加字符串 append name "Diaodiao"->helloDiaodiao
strlen: 获得字符串长度 strlen name ->5
2.2 hashes(存储键值对,类似于hashmap)
2.2.1 配置(redis.conf配置文件中)
默认:hash-max-zipmap-entries 配置字段最多64个(key的个数)
hash-max-zipmap-value 配置value最大为512字节
2.2.2 命令(参考String)
hset key field value
hset:若key不存在就创建,否则覆盖。
hsetnx:设置 hash field 为指定值,如果 key 不存在,则先创建。如果 field 已经存在,返回 0,nx 是not exist 的意思。
hmset:同时设置hash多个field
hget:获取指定的hash field
hmget:获取全部指定的hash field
hexists:测试指定field是否存在
hlen:返回指定的field的个数
hdel:删除指定field。
hkeys:查询指定key的所有field
hvals:获取指定key的所有value
hgetall:获得指定key的所有field以及值
2.3、lists
2.3.1 简介
list是基于双向链表的数据结构,操作就是入栈(push)、出栈(pop),包括左(头)入出栈、右(尾)入出栈,也含有超时阻塞的功能。
2.3.2 命令
lpush:在key对应的list的头部添加元素。
lrange:获得list范围的值。 lrange mylist start(0) stop(2)(获取0 1 2索引的值)
rpush:在key对应的list的尾部添加元素
linsert:在key对应的特定位置之前或者之后添加字符串元素 linsert mylist before “world” “hello”
lset:设置list指定下表的元素(从0开始)
lrem:从key对应的list里,删除count个value相同的元素。
ltrim:保留指定key的值范围内的数据。
lpop:从list的头部删除元素,并且返回删除元素
rpop:从list的尾部删除元素,并且返回删除元素
rpoplpush:第一个list的尾部移除元素并且添加到第二个list的头部
lindex:返回名称为key的list中index位置的元素
llen:返回key对应list的长度
2.4、sets
2.4.1 简介
sets是无序集合,是通过hashtable实现的。额外功能有并集、交集、差集。
2.4.2 命令
sadd:向名称为key的set当中添加元素
srem:删除名称为key的元素
spop:随机返回并且删除set中某key元素
sdiff:两个set的差集
sdiffstore:假设有set3、set1、set2-->set1与set2差集返回的元素,添加到set3中
sinter:两个set的交集
sinterstore:假设有set3、set1、set2-->set1与set2交集返回的元素,添加到set3中
sunion:两个set的并集
sunionstore:假设有set3、set1、set2-->set1与set2交集返回的元素,添加到set3中
smove:假设有set1、set2-->删除set1的某个key值,并且添加到set2
scard:返回set的元素个数
sismember:测试set中是否存在某member(元素)。
srandmember:随机返回一个元素,但是不删除
2.5、sorted set
2.5.1 简介
sorted set(skip list|双向链表和hashtable的结合体)是set的一个升级版本,升级版本的sets,有两个纬度,一个纬度用来存顺序,一个纬度用于存value。
2.5.2 命令
zadd:向名称为key的zset中添加元素member、score用于排序。如果该元素存在,则根据score更新该元素的顺序
zrem:删除名为key的zset的元素member
zincrby:如果在名称为 key 的 zset 中已经存在元素 member,则该元素的 score 增加 increment;否则向集合中添加该元素,其 score 的值为 increment
zrank:返回名称为 key 的 zset 中 member 元素的排名(按 score 从小到大排序)即下标
zrevrank:返回名称为 key 的 zset 中 member 元素的排名(按 score 从大到小排序)即下标
zrange:返回名称为 key 的 zset(按 score 从小到大排序)中的 index 从 start 到 end 的所有元素
zrevrange:返回名称为 key 的 zset(按 score 从大到小排序)中的 index 从 start 到 end 的所有元素
zrangebyscore:返回集合中 score 在给定区间的元素
zcount:返回集合中 score 在给定区间的数量
zcard:返回集合中元素个数
zscore:返回给定元素对应的 score
zremrangebyrank:删除集合中排名在给定区间的元素
zremrangebytscore:删除集合中 score 在给定区间的元素
三、Redis的持久化
3.1(snapshotting)(快照)
- 快照,顾名思义可以理解为拍照一样,把整个内存数据映射到硬盘中,保存一份到硬盘,因此恢复数据起来比较快,把数据映射回去即可,不像AOF,一条条的执行操作命令。
-
用户在配置文件了配置了类似这样的命令
save 900 1 // 900内,有1条写入,则产生快照save 300 1000 // 如果300秒内有1000次写入,则产生快照
save 60 10000 // 如果60秒内有10000次写入,则产生快照
3.2 配置快照文件的名称
- 在redis 的配置文件redis.conf 设置dbfilename指定rdb快照文件的名称
dbfilename dunmp.rdb
3.3AOF持久化
默认的情况下redis没有开启aof(append only file)的方式持久化。【操作一次就写一次数据】
- 可以修改redis的配置文件 redis.conf的配置文件中appendonly参数开启
appendonly yes
开启aof持久化后每执行一条就会更改redis的数据命令,redis就会将命令写入硬盘中的aof文件
AOF文件的保存位置和RDB文件的位置相同,都是通过dir的参数设置
dir ./
默认的文件名是appendonly.aof,可以通过appendfilename参数修改