目录
NOSQL简介
非关系型数据库特点
Redis简介
redis安装
redis数据类型
String类型
Hash类型(相当于map)(取变量名、设置map中的key value)
List类型(就像java中的queue)(有的公司利用redis的list做mq)
set(无序)类型和zset(有序)类型(像java中的list)
zset集合
redis高级命令
redis的安全性
redis持久化机制
NoSQL,泛指非关系型的数据库,NoSQL数据库的四大分类:
键值(key-value)存储数据库:这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。如Redis,Voldemort,Oracle BDB。
列存储数据库:这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。如HBase,Riak
文档型数据库:该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看做是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB,MongoDB
图形(Graph)数据库:图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据结构或者查询API。如:Neo4J,InfoGrid,Infinite Graph
1.数据模型比较简单
2.需要灵活性更强的应用系统
3.对数据库性能要求较高
4.不需要高度的数据一致性
5.对于给定key,比较容易映射复杂值的环境
是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些要求(非关系型的、分布式的、开源的。水平可扩展的)
优点:对数据高并发读写(数据写入内存);对海量数据的高效率存储和访问;对数据的可扩展性和高可用性。
缺点:redis(ACID处理非常简单);无法做到太复杂的关系数据库模型
Redis的键可以包含:(string)字符串,哈希,(list)链表,(set)集合,(zset)有序集合。这些数据集合都支持push/pop,add/remove及取交集和并集以及更丰富的操作,redis支持各种不同的方式排序,为了保证效率,数据都是缓存在内存中,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加到文件里。
单线程单进程,
数据持久化的方法:
RDB:定期将数据从内存刷到硬盘上。
AOF:只要进行DML操作(写操作),就将这个操作写到日志里。
下载地址http://redis.io/download安装步骤:
1 首先需要安装gcc,把下载好的redis-3.2.1-rc2.tar.gz 放到linux /usr/local文件夹下
2 进行解压 tar -zxvf redis-3.2.1-rc2.tar.gz
3 进入到redis-3.2.1目录下,进行编译 make
4 进入到src下进行安装 make install 验证(ll查看src下的目录,有redis-server 、redis-cil即可)
5 建立俩个文件夹存放redis命令和配置文件
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/bin
6 把redis-3.2.1下的redis.conf 移动到/usr/local/redis/etc下,
cp redis.conf /usr/local/redis/etc/
7 把redis-3.2.1/src里的mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-check-dump、redis-cli、redis-server
文件移动到bin下,命令:
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
8 启动时并指定配置文件:./redis-server /usr/local/redis/etc/redis.conf(注意要使用后台启动,所以修改redis.conf里的 daemonize 改为yes)
9 验证启动是否成功: ps -ef | grep redis 查看是否有redis服务 或者 查看端口:netstat -tunpl | grep 6379
进入redis客户端 ./redis-cli 退出客户端quit 退出redis服务:
(1)pkill redis-server 、
(2)kill 进程号、
(3)/usr/local/redis/bin/redis-cli shutdown
使用:keys * ;set name value; get name
redis一共分为五种基本数据类型:(string)字符串,哈希,(list)链表,(set)集合,(zset)有序集合
String类型是包含很多种类型的特殊类型,并且是二进制安全的。比如序列化的对象进行存储,比如一张图片进行二进制存储,比如一个简单地字符串,数值等等。
set和get方法:
设置值:set name xxx (说明:设置name多次会覆盖)。
取值:get name 。
删除值:del name。
使用setnx(not 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 val1 key2 val2 key3 val3 ;对应的mget key1 key2 key3方法
对应的也有msetnx和mget方法。
一次性设置和取值的getset方法:
set key4 val4 ;getset key4 val44 返回旧值并设置新值得方法。
incr和decr方法(incr age:age+1并直接打印):对某一个值进行递增和递减。
incrby和decrby方法(incrby age 3:age+3并直接打印):对某个值进行指定长度的递增和递减
append [name] 方法(append name 123:name追加123并返回长度):字符串追加方法
strlen [name]方法(strlen name:返回字符串长度):获取字符串的长度
Hash类型是String类型的field和value的映射表,或者说一个String集合。特别适合存储对象,相比较而言,每一个对象类型存储在Hash类型里要比存储在String类型里占用更少的内存空间,并方便存取整个对象。
形如hset myhash field1 hello(含义是hset是hash集合,myhash是集合名字,field1是字段名hello为其值)使用hmset myhash sex man addr beijing批量设置,也可以使用hmget进行批量获取多个键值对。
hget myhash field1 取值(只能取到hash的某个字段,不能取整个hash)。
同样也有hsetnx,和setnx大同小异。
hincrby和hdecrby集合递增和递减。
hexists 是否存在key,如果存在返回,不存在返回0.
hlen 返回hash集合里的所有的键数值。
hdel:删除指定的hash的field。
hkeys 返回hash里所有的字段。
hvals 返回hash的所有value。
hgetall 返回hash里所有的key和value。
List类型是一个链表结构的集合,其主要功能有push、pop、获取元素等。更详细的说,List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,list的设计非常简单精巧,既可以作为栈,又可以作为队列。满足绝大多数需求。
lpush方法:从头部加入元素(栈) 先进后出
形如:lpush list1 "hello"; lpush list1 "world";lrange list 0 -1(表示从头取到末尾,从0位置到-1位置)。
rpush方法:从尾部加入元素(队列) 先进先出
形如:rpush list2 "beijing"; rpush list2 "sss"; lrange list2 0 -1 从头取到尾
linsert方法:在集合中间插入元素
形如:linsert list3 before [集合的元素] [插入的元素]
lset方法:将指定下标的元素替换掉
形如:lset list4 0 "aaa"
lrem方法:删除元素,返回删除的个数
形如:lrem list4 2 "aaa" (移除2个aaa)
ltrim方法:保留指定key的值范围内的数据
形如:ltrim list5 2 3 保留 第2-3个元素
lpop方法:从list头部删除元素,并返回删除的元素
形如:lpop list6
rpop方法:从list尾部删除元素,并返回删除的元素
形如:rpop list6
rpoplpush方法:第一步从尾部删除元素,第二步从头部加入元素
形如:rpoplpush list8 list8
lindex方法:返回名称为key的list中index位置的元素
形如:lindex list8 1
llen方法:返回元素个数
形如:llen list8
set集合是string类型的无序集合,set是通过hashtable实现的,对集合我们可以取交集、并集、差集。
sadd方法:向名称为key的set中添加元素
形如:sadd set1 aaa
小结:set集合不允许重复元素(再加重复的无效果);smembers查看set集合的元素。
形如:smembers set1
srem方法:删除set集合元素
spop方法:随机返回删除的key
sdiff方法:返回两个集合的不同元素(哪个集合在前面就以哪个集合为标准)
sdiffstore方法:将返回的不同元素存储到另一个集合里
形如:sdiffstore set3 set1 set2
小结:这里是把set1和set2的不同元素(以set1为准)存储到set3集合里
sinter方法:返回集合的交集
sinterstroe方法:返回交集结果,存入set3中
形如:sinterstroe set3 set1 set2
sunion方法:取并集
sunionstore方法:取得并集,存入set3中
形如:sunionstore set3 set1 set2
smove方法:从一个set集合移动到另一个set集合里
形如:smove set1 set2 a 将set1中的a移动到set2,相当于剪切复制
scard方法:查看集合里元素个数
sismember方法:判断某元素是否为集合中的元素
返回1代表是集合中的元素,0代表不是
srandmember方法:随机返回一个元素
形如:srandmember set1
zadd向有序集合中添加一个元素,该元素如果存在,则更新顺序。
形如:zadd zset1 6 six (6是序号,six是值)
zrange zset1 0 -1 withscores 查看集合中的值(withscores表示同时显示元素标号)
zrem删除名称为key的zset中的元素member
形如:zrem zset1 one 删除zset1中的one
zincrby 以指定值去自动递增或者减少,用法和之前的incrby类似
zrangebyscore 找到指定区间范围的数据进行返回
zremrangebyrank 删除1到1(只删除索引1)
zremrangebyscore 删除指定序号
zrank 返回排序索引 从小到大排序(升序排序之后再找索引)
注意 一个是顺序号 一个是索引 zrank返回的是索引
zrevrank 返回排序索引 从大到小排序(降序排序之后再找索引)
形如:zrank set1 four (升序排序之后再找索引)
zrangebyscore zset1 2 3 withscore 找到指定区间范围的数据进行返回
zcard 返回集合里所有元素的个数
zcount 返回集合中score在给定区间中的数量
形如:zcount zset1 1 4
zremrangebyrank zset [from] [to] 删除索引 根据索引删除
zremrangebyscore zset [from] [to] 删除指定序号
返回满足的所有键 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 实时传储收到的请求(返回相关的配置信息)
config get * 返回所有配置(相当于redis.config的缩影)
flushdb 清空当前数据库,flushall 清空所有数据库
因为redis速度相当快,所以在一台比较好的服务器下,一个外部用户在一秒内可以进行15W次的密码尝试,这意味着你需要设定非常强大的密码来防止暴力破解。
vi编辑redis.conf文件,找到下面进行保存修改
#requirepass footbared
requirepass ****
重启服务器 pkill redis-server
再次进入127.0.0.1:6379>keys *
(error) NOAUTH Authentication required.
会发现没有权限进行查询127.0.0.1:6379>auth password
OK输入密码则成功进入
每次进入的时候都要输入密码,还有种简单的方式:
直接授权登录:redis-cli -a password
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化。
redis持久化的两种方式:redis.conf中的配置
1.snapshptting(快照)默认方式,将内存中以快照的方式写入到二进制文件中。默认为dump.rdb,可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key则修改就自动做快照。
snapshotting设置:
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存
save 60 10000
2.append-only file(缩写aof)的方式(有点类似于oracle日志),由于快照方式是在一定时间间隔做一次,所以可能发生redis以外down的情况就会丢失最后一次快照后的所有修改的数据、aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到命令中,当redis重新启动appendonly.aof。aof不是立即写到硬盘上,可以通过配置文件修改强制写到硬盘中。
aof设置:
appendonly yes //启动aof持久化方式有三种修改方式:
#appendfsync always //收到写命令就立刻写入到磁盘,效率最慢,但是保证完全的持久化
#appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
#appendfsync no //完全依赖os 性能最好,持久化没保证
开启aof之后,rdb就失效了。