Redis:前端
关系型数据库(SQL):MySQL、Oraclemysql
特色:数据与数据之间,表与字段之间,表与表之间是存在关系的c++
优势:
一、数据之间有关系,进行数据的增删改查时很是方便。
二、关系型数据库,有事物操做。保证数据的完整性。redis
缺点:
一、由于数据和数据之间有关系,是由底层大量算法保证的。大量算法会拉低系统运行速度。大量算法会消耗系统资源
二、海量数据的增删改查时,会显的无能为力。在作某些操做时,极可能会宕机(卡死)
三、在海量数据环境下对数据表进行维护/扩展,也会变得无能为力。适合处理通常量级的数据。保证的是安全。算法
非关系性数据库(NOSQL):Redis、mongoDBsql
为了处理海量数据,须要将关系型数据库的关系 去掉。非关系型数据库设计之初,是为了替代关系型数据库的。数据库
优势:
一、海量数据的增删改查,很是轻松。
二、海量数据的维护/扩展,也会很是轻松。后端
缺点:
一、由于数据与数据之间没有关系,因此不能一目了然。
二、非关系型数据库,没有关系,没有强大的事物来保证数据的完整和安全。缓存
适合处理海量数据,保证的是效率。不必定安全。安全
NoSql数据库的四大分类:
一、键值(Key-Value)存储数据库。
相关产品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用:内容缓存,主要用于处理大量数据的高访问负载
数据模型:一系列的键值对。
优点:优秀的快速查询,稳定性强。
劣势:存储的数据缺乏结构化。
二、列存储数据库
相关产品:Cassandra、HBase、Riak
典型应用:分布式的文件系统。
数据模型:以列簇式存储,将同一列数据存储在一块儿。
优点:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限,使用极大的内存才可调配,且系统处理算法时将有数秒,甚至更长时间的不可用,致使大量处理超时。
三、文档型数据库(淘汰)
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value相似,Value时结构化的)
数据模型:一系列键值对
优点:数据结构要求不严格
劣势:查询性能不高,并且缺少统一的查询语法。
四、图形(Graph)数据库:
相关产品:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络(关系网)
数据模型:图结构
优点:利用图结构相关算法。
劣势:须要对整个图作计算才能得出结果,不容易作分布式的集群方案。局限性过强。
Redis使用环境:
一、能够做为关系型数据库的缓存存在。
二、能够作任务队列。
三、能够作大量数据运算。
四、能够作大量数据的排行榜。
Linux系统 Redis 安装:
redis是C语言开发,安装redis须要先将官网下载的源码进行编译,编译依赖gcc环境。若是没有gcc环境,须要安装gcc:yum install gcc-c++
一、上传redis.tar.gz的安装包。并解压到当前目录:tar -zxvf redis-3xxxxx.tar.gz
二、编译redis(编译,将.c文件编译为.o文件)
进入解压文件夹:cd redis-3xxxxx
执行 make
若是没有安装gcc,编译将出现错误提示。(安装失败,必须删除文件夹,从新解压)
三、安装:make PREFIX=/usr/local/redis install
PREFIX指定的目录能够随意指定。
安装完后,在/usr/local/redis/bin下有几个可执行文件:
redis-benchmark >> 性能测试工具
redis-check-aof >> AOF文件修复工具
redis-check-dump >> RDB文件检查工具(快照持久化文件)
redis-cli >> 命令行客户端
redis-server >> redis服务器启动命令
四、回到根目录:cd ~ 进入redis-3xx 文件中,
Copy复制redis.conf文件到/usr/local/redis目录下(和bin同级目录中)
注:若没有配置文件redis也能够启动,不过将启动默认配置,不方便修改端口号等信息。
Redis启动:对应默认端口号6379
前端启动:进入/usr/local/redis文件夹下:./bin/redis-server 启动
启动客户端:./bin/redis-cli 或 ./bin/redis-cli -h IP地址 -p 6379
缺点:没法部署集群。
后端启动:修改redis.conf配置文件,将daemonize改成yes之后端模式启动
启动时,指定配置文件:进入/usr/local/redis:cd /usr/local/redis
启动:./bin/redis-server ./redis.conf
Redis关闭:
一、查询PID,kill -9 pid 杀死进程。
至关于断电,非正常关闭,极可能会形成数据丢失。
二、正常关闭:正常关闭,数据保存
./bin/redis-cli shutdown
Redis数据类型:
redis使用的时键值对 保存数据。至关于Map 。
key:都是字符串。key名都是自定义的。
value:对应五种数据类型
一、String字符串
二、hash:数据格式相似于JSON
例:{uname:"zs",age:"18"}
三、list集合: 至关于Java中的LinkedList链表。添加/删除效率极高。
例:[1,2,3,4]
四、set:至关于Java中的HashSet
例:['a','b','c']
五、有序的set集合:
例:[1000 'a',100 'b' 10 'c']
String:
字符串类型时Redis中最为基础、经常使用的数据存储类型。字符串在Redis中二进制安全的。这意味者该类型存入和获取的数据相同。在Redis中字符串类型的Value最多能够容纳的数据长度为512M。
二进制安全和数据安全是没有关系的。
MySQL关系型数据库,二进制不安全。由于存储的编码和取出的编码格式不一致,会形成乱码而丢失数据。
一、频繁的编解码会浪费大量的系统性能。
二、频繁的编解码极可能由于码表不一样致使乱码。
因此二进制不安全。
Redis非关系型数据库,二进制安全。
一、编解码都是在客户端完成的。没有频繁编解码,执行效率高。
二、没有频繁编解码,不会出现乱码。
因此二进制数据安全。
赋值(增、改):
set key value :设定key只有指定的字符串value
若是该key存在则进行覆盖(修改)操做。老是返回"OK"
取值(查):
get key:获取key的value。若该key的关联的value不是String类型,redis将返回错误信息,由于get命令只能用于获取String类型的value;若该key不存在,返回(nil)。
删:
del key :删除指定key。返回值是数字类型。表示删除几条数据。
扩展:
getset key value:先获取该key的值,再设置该key的值。
incr key:将指定的key的value原子性的递增1。
若该key不存在,其初始值为0,再incr以后其值为1。
若value的值不能转成整型,该操做将执行失败并返回相应的错误信息。
decr key:将指定的key的value原子性的递减1。
若该key不存在,其初始值为0,再decr以后其值为-1。
若value的值不能转成整型,该操做将执行失败并返回相应的错误信息。
append key value:拼凑字符串。
若该key存在,则在原来的value后追加该值。
若该key不存在,则从新建立一个key,并赋值value。
incrby key increment:将指定的key的value原子性增长increment。
若该key不存在,其初始值为0,在incrby后,其值为increment。
若该值不能转成整型,则失败并返回错误信息。
decrby key decrement:将指定的key的value原子性减小decrement。
若该key不存在,其初始值为0,在decrby后,其值为decrement。
若该值不能转成整型,则失败并返回错误信息。
String的使用环境:主要用于保存JSON格式的字符串。
hash:
Redis中的Hash类型能够堪称具备String key和String value的map容器。每个Hash能够存储4294967295个键值对。
赋值:
hset key field value :为指定的key设定field/value对(键值对)。至关于 增。
hmset key field value field1 value1...:为指定的key设定多个field/value对(键值对)。
取值:
hget key field:获取指定的key的field值。
hmget key field field1...:获取指定key的多个field值。
hgetall key:获取key中的全部field-value。
删除:
hdel key field field1...:删除一个或多个field字段。
del key:删除正个hash。
扩展:
hincrby key field increment :设置key中field的值增长increment。
hexists key field :判断指定的key中filed是否存在。
hlen key :获取key所包含的field的数量。
hkeys key :获取全部的字段。
hvals key :获取全部的value。
list:
链表LinkList。Redis操做中,最多的操做是进行元素的增删。
使用环境:
一、作大数据集合的增删
二、作任务队列
赋值:
lpush key values[value1 value2...]:在指定的key所关联的list头部插入全部的values。
若该key不存在,该命令在插入的以前建立一个与该key关联的空链表,以后再向该链表的头部插入数据。插入成功,返回元素的个数。
例:lpush list1 a b c d
rpush key values[value1 value2...]:在该list的尾部添加元素。
例:rpush list2 a b c d
取值:
lrange key start end:获取链表中从start到end的元素的值。start、end从0开始计数;也可为负数。
若为-1 则表示链表尾部的元素;-2 则表示倒数第二个元素;以此类推...
例:取所有元素:lrange key 0 -1
删除:
lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。
若该key不存在,返回nil;
若该key存在,则返回链表的头部元素。
rpop key:从尾部弹出元素。
扩展:
llen key:返回指定的key关联的链表中的元素的数量。
lrem key count value:删除某种元素。效率极为低下。删除count个值为value的元素。
若count大于0,从头向尾遍历并删除count个值为value的元素。
若count小于0,则从尾向头遍历并删除正数count个值为value的元素。
若count等于0,则删除链表中全部等于value的元素。
例:lrem list1 0 a 表示从左删除list1中全部的a
lrem list1 2 a 表示从头删除list1中的2个a
lrem list1 -2 a 表示从尾删除list1中的2个a
lset key index value:经过索引替换元素。效率不高。设置链表中的index的角标的元素值。0表明链表的头元素,-1表明链表的尾元素。操做链表的角标不存在则抛异常。
linsert key before/after prvot value:从索引前/后插入元素。效率不高。在pivot元素前或后插入value这个元素。
rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。[循环操做]
例:rpoplpush list1 list2 俩队排列
rpoplpush list1 list1 循环队列
set:
set集合中不容许出现重复的元素。
做用:在Redis操做中,涉及到俩个大数据集合的并集、交集、差集的运算。
赋值:
sadd key values[value一、value2...]:向set中添加数据,若该key的值已存在则不会重复添加
例:sadd set1 a b c d
取值:
smembers key :获取set中全部元素。
例:smembers set1
sismember key member:判断参数中指定的成员是否在该set中。1 表示存在,0 表示不存在或该key自己就不存在。不管集合中有多少元素均可以极快的返回结果。
例:sismember set1 a 判断集合set1中是否有a元素
删除:
srem key values[value一、value2...]:删除set中指定的元素
例:srem set1 a c
差集运算:
sdiff key1 key2...:返回key1与key2中相差的元素,并且与key的顺序有关。即返回差集。
交集运算:
sinter key1 key2 key3...:返回交集
并集运算:
sunion key1 key2 key3...:返回并集
扩展:
scard key:获取set中元素的数量。
srandmember key :随机返回set中的一个元素。
sdiffstore destination key1 key2...:将key一、key2相差的元素存储在destination上
例:sdiffstore set1 set2 set3 将set2与set3的差集元素存储到set1中。
sinterstore destination key[key...]:将返回的交集存储在destination上
例:siterstore set1 set2 set3 将set2与set3的交集元素存储到set1中。
sunionstore destination key[key...]:将返回的并集存储在destination中
例:sunionstore set1 set2 set3 将set2与set3的并集元素存储到set1中。
有序set集合:
有序且不重复。有序set集合专门用来作排行榜。
赋值:
zadd key score member score2 member2...:将全部元素以及该元素的分数存放到sorted-set中。若该元素已经存在,则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含以前已经存在的元素。
例:zadd set1 1000 zhangsan 100 lisi 10 王五
查看:
zscore key member:返回指定元素的分数。
例:zscore set1 zhangsan
zcard key : 获取集合中的元素数量
例:zcard set1
zrange key start end[withscores]:范围查询。获取集合中脚标为start-end的元素,[withscores]参数代表返回的元素包含分数。
例:zrange set1 0 -1 查询全部元素。正序排列。由小到大
zrange set1 0 -1 withscores 查询全部元素。而且带有各自的分数。正序。由小到大
zrevrange key start end[withscores]:范围查询。获取集合中脚标为start-end的元素,[withscores]参数代表返回的元素包含分数。
例:zrevrange set1 0 -1 查询全部元素。倒序排列。由大到小
zrevrange set1 0 -1 withscores 查询全部元素。而且带有各自的分数。倒序。由大到小
删除:
zrem key member[member...]:删除集合中指定元素。能够指定多个。
例:zrem set1 zhangsan lisi
zremrangebyrank key start stop:按照排名范围删除元素。
例:zremrangebyrank set1 0 1 删除前俩名
zremrangebyscore key min max:按照分数范围删除元素。
例:zremrangebyscore set1 50 500 删除分数在50到500之间的元素
扩展:
zrangebyscore key min max[withscores][limit offset count]:返回分数在min-max的元素并按照分数从低到高排序。[withscores]:显示分数;[limit offset count]:offset,代表从脚标为offset的元素开始,并返回count个元素。
例:zrangebyscore set1 50 500 返回分数在50-500之间的元素。
zrangebyscore set1 50 500 withscores 返回分数在50-500之间的元素。加上分数。
zrangebyscore set1 50 500 withscores limit 0 1 返回分数在50-500之间的元素。加上分数。而且只查前1个元素。
zincrby key increment member:设置指定成员的增长分数。返回更改后的分数
例:zincrby set1 10 zhangsan 给zhangsan增长10分。
zcount key min max: 获取分数在min-max之间的元素。
例:zcount set1 50 500 计算50-500分数之间的元素由多少
zrank key member:返回成员在集合中的排名。索引(从小到大)
例:zank set1 zhangsan 返回zhangsan的排名。
zrevrank key member:返回元素在集合中的排名。索引(从大到小)
例:zrevrank set1 zhangsan 返回zhangsan的排名。
通用命令:
keys pattern:获取全部与pattern匹配的key,返回全部与该key匹配的keys。
通配符:
*:表示任意一个或多个字符。
?:表示任意一个字符。
例:keys * 查询全部的key
keys ???? 查询key长度是四位的key名。
keys *name* 查询key名包含name的key名。
del key1 key2...:删除指定的key。能够指定多个。
exites key:判断该key是否存在,1表明存在。0表明不存在。
rename key newkey:为当前的key重命名。
type key:获取指定key的类型。该命令将以字符串的格式返回。返回的字符串为string、list、set、hash和zset。若是key不存在,则返回none。
设置key有效时间:
expire key:设置过时时间。单位:秒
ttl key:获取该key所剩的超时时间,若没有设置超时,返回-1。若返回-2,表示超时不存在。
消息订阅与发布:
subscribe channel:订阅频道。
例:subscribe mychat 订阅mychat这个频道。
psubscribe channel*:批量订阅频道。
例:psubscribe s* 订阅以s开头的频道。
publish channel content:在指定的频道中发布消息。
例:publish mychat 'abcdefg'
多数据库:
Redis的数据库已经提早建立好了,默认有16个数据库。数据库的名字是0,1,2...15号数据库。在redis上所作的全部数据操做,都是默认在0号数据上操做的。数据库与数据库之间,是不能共享键值对的。
切换数据库:select 数据库名(1,2,3...15)
把某个键值对进行数据库的移植:move key 1:将key键移植到1号数据库中。
清空当前数据库:flushdb
清空全部的数据库内容:flushall
事物:
mysql的事物是为了保证数据完整性,安全。
Redis的事物是为了进行redis语句的批量化执行。
multi:开启事物,用于标记事物的开始,其后执行的命令都将被存入命令队列,知道执行EXEC时,这些命令才会被原子的执行。
相似与关系型数据库中的:begin transaction
exec:提交事物,相似与关系型数据库中的:commit
discard:事物回滚,相似与关系型数据库中的:rollback
了解命令:
ping:返回PONG为已成功连通
echo:在命令行打印一些内容 echo hehe
select:切换数据库 select 1
quit:退出客户端。等同于:Ctrl+C
dbsize:返回当前数据库中key的数量。
info:获取服务器的信息和统计。
持久化:把数据保存在硬盘上。
关系型数据库MySQL-持久化:
任何的增删改语句,都是在硬盘上作的操做。
断电之后,硬盘上的数据仍是存在。
非关系型数据库Redis-持久化:
默认状况下,全部的增删改,数据都是在内存中进行操做。
断电之后,内存中的数据不存在。redis的部分数据会丢失,丢失的数据时保存在内存中的数据。因此Redis是存在持久化操做的。
Redis有俩种持久化策略:
RDB:是Redis的默认持久化机制。RDB至关于照快照,保存的是一种状态。
优势:
一、快照保存数据速度极快,还原数据速度极快。
二、适用于灾难备份。
缺点:
一、小内存机器不适合使用。由于RDB机制符合要求就会照快照。(随时随地启动)会占用部分系统资源(忽然的占用),极可能内存不足直接宕机。
适用于:内存比较充裕的计算机。
RDB什么时候进行照快照:
一、服务器正常关闭时,照快照。
二、key知足必定条件时,照快照。
配置说明:
一、save 900 1:每900秒至少有一个key发生变化,则dump内存快照。
二、save 300 10:每300秒至少有10个key发生变化,则dump内存快照。
三、save 60 10000:每60秒至少10000个key发生变化,则dump内存快照。
AOF:
使用日志功能保存数据的操做。适用于:内存比较小的计算机。
每秒同步(默认):每秒进行一次AOF保存数据。安全性低,但比较节省系统资源。
每修改同步:只要有key变化语句,就进行AOF保存数据。比较安全,但极为浪费系统资源。
不一样步:不进行任何持久化操做。不安全。
AOF操做:
只会保存致使key变化的语句。
AOF配置:
AOF默认时关闭的。
开启AOF:
一、appendonly yes
二、放开 appendfsync always
always:每次有数据修改发生时都会写入AOF文件。
everysec:每秒同步一次,该策略为AOF的缺省策略。
no:从不一样步,高效但数据不会被持久化。
优势:
持续性占用极少许的内存资源。
缺点:
一、日志文件会特别大,不适用于灾难恢复。
二、恢复效率远远低于RDB。
Jedis:
全部的Redis命令,Jedis都有对应的方法。
Java中链接Redis数据库须要开启Linux中Redis对应的端口号:
/shin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
/etc/rc.d/init.d/iptables save
单实例链接Redis数据库:Jedis jedis=new Jedis("IP",6379);
Jedis链接池:
JedisPoolConfig config = new JedisPoolConfig();//设置链接池的配置对象 //能够不设置池的参数 config.setMaxTotal(int);//设置池中最大链接数 config.setMaxIdle(int);//设置空闲时池中包有的最大链接数 JedisPool pool = new JedisPool(config,"IP",6379);//设置链接池对象 Jedis jedis=pool.getResource();//从池中获取链接对象。 jedis.get("name"); jedis.close();//链接归还池JedisPool中
JedisUtils:
public class JedisUtils{ //定义一个链接池对象 private final static JedisPool POOL; static{//初始化操做 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(int); config.setMaxIdle(int); POOL = new JedisPool(config,"IP",6379); } //从池中获取链接 public static Jedis getJedis(){ return POOL.getResource(); } }