解决应用服务器的CPU和内存压力;解决数据库服务的IO压力;java
----->>> ① session存在缓存数据库(彻底在内存里),速度快且数据结构简单;c++
打破了传统关系型数据库以业务逻辑为依据的存储模式,而针对不一样数据结构类型改成以性能为最优先的存储方式--非关系型数据库K, V。redis
② 缓存数据库:减小io的读操做(缓存数据库中有的直接从缓存数据库里边去取,没有再去数据库里边查找,减小了IO的操做);sql
列式数据库如Hbase、文档数据库Mongodb;水平切分、垂直切分、读写分离;经过破坏必定的业务逻辑来换取性能数据库
NoSQL(NoSQL = Not Only SQL ),意即“不只仅是SQL”,泛指非关系型的数据库。json
NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。所以大大的增长了数据库的扩展能力。windows
不遵循SQL标准。不支持ACID。远超于SQL的性能。NoSQL适用场景数组
NoSQL适用场景:缓存
对数据高并发的读写;海量数据的读写;对数据高可扩展性的安全
NoSQL不适用场景:
须要事务支持;基于sql的结构化查询存储,处理复杂的关系,须要即席查询。
Memcached和Redis的区别:ms
Memcached
① 数据都在内存中,不支持久化
② 支持简单的key-value模式
通常是做为缓存数据库辅助持久化的数据库
③ 多线程+锁(memcached)
Redis
几乎覆盖了Memcached的绝大部分功能
① 数据都在内存中,支持持久化,主要用做备份恢复
② 除了支持简单的key-value模式,还支持多种数据结构的存储,好比String、 list、set、zset、hash五大数据类型。
通常是做为缓存数据库辅助持久化的数据库
③ 单线程+多路IO复用(Redis)
mongoDB
高性能、开源、模式自由(schema free)的文档型数据库
数据都在内存中, 若是内存不足,把不经常使用的数据保存到硬盘
虽然是key-value模式,可是对value(尤为是json)提供了丰富的查询功能
支持二进制数据及大型对象
能够根据数据的特色替代RDBMS ,成为独立的数据库。或者配合RDBMS,存储特定的数据。
行式存储数据库(即关系型数据库),一行一行的存储
第一个须要IO1次,行式存储;第二个须要IO3次,id=1,id=2,id=3
列式存储数据库
查询年龄(IO1次)的要快于查询id=3的(IO4次);
行式存储查询快,统计慢;列式存储查询慢,统计快;
HBase--列式数据库
HBase是Hadoop项目中的数据库。它用于须要对大量的数据进行随机、实时的读写操做的场景中。HBase的目标就是处理数据量很是庞大的表,能够用普通的计算机处理超过10亿行数据,还可处理有数百万列元素的数据表。
Cassandra
Apache Cassandra是一款免费的开源NoSQL数据库,其设计目的在于管理由大量商用服务器构建起来的庞大集群上的海量数据集(数据量一般达到PB级别)。在众多显著特性当中,Cassandra最为卓越的长处是对写入及读取操做进行规模调整,并且其不强调主集群的设计思路可以以相对直观的方式简化各集群的建立与扩展流程。
Noe4j
主要应用:社会关系,公共交通网络,地图及网络拓谱
Redis是一个开源的key-value存储系统。和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上,Redis支持各类不一样方式的排序。与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步。
一、下载得到redis-3.2.5.tar.gz后将它放入咱们的Linux目录/opt
Alt+p弹出框, àsftp> pwd cd /opt/ 而后把压缩包拖到里边
二、解压命令:tar -zxvf redis-3.2.5.tar.gz
三、解压完成后进入目录:cd redis-3.2.5
四、在redis-3.2.5目录下执行make命令
运行make命令时出现故障意出现的错误解析:gcc:命令未找到
能上网:--->>
yum install gcc
yum install gcc-c++
五、在redis-3.2.5目录下再次执行make命令
Jemalloc/jemalloc.h:没有那个文件
解决方案:运行make distclean以后再 make
六、在redis-3.2.5目录下再次执行make命令
Redis Test(能够不用执行)
执行完make后,跳过Redis test 继续执行make install
查看默认安装目录:usr/local/bin cd /usr/local/bin
[kris@hadoop local]$ cd /usr/local/bin [kris@hadoop bin]$ ll 总用量 26340 -rwxr-xr-x. 1 root root 5580327 1月 10 13:25 redis-benchmark 性能测试工具,能够在本身本子运行,看看本身本子性能如何(服务启动起来后执行) -rwxr-xr-x. 1 root root 22217 1月 10 13:25 redis-check-aof 修复有问题的AOF文件,rdb和aof后面讲 -rwxr-xr-x. 1 root root 7826782 1月 10 13:25 redis-check-dump 修复有问题的dump.rdb文件 -rwxr-xr-x. 1 root root 5709036 1月 10 13:25 redis-cli 客户端,操做入口 lrwxrwxrwx. 1 root root 12 1月 10 13:25 redis-sentinel -> redis-server Redis集群使用 -rwxr-xr-x. 1 root root 7826782 1月 10 13:25 redis-server Redis服务器启动命令 [kris@hadoop bin]$
启动:
一、备份redis.conf:拷贝一份redis.conf到其余目录
[root@kris bin]# ps -ef | grep redis root 7901 3479 3 10:29 pts/0 00:00:00 grep redis 查看到redis进程已关 [root@kris bin]# cd /opt/redis-3.2.5 ll查看这个目录下命令 mkdir /root/myredis cp redis.conf /root/myredis 复制备份redis.conf文件
二、修改redis.conf文件将里面的daemonize no 改为 yes,让服务在后台启动
cd myredis/ vi redis.conf
三、启动命令:执行 redis-server /myredis/redis.conf
redis-server redis.conf redis-cli
四、用客户端访问: redis-cli
多个端口能够 redis-cli –p 6379
五、测试验证: ping
单实例关闭:redis-cli shutdown 也是把redis服务器关了;
也能够进入终端后再关闭shutdown ;关闭服务器,而不是把客户端给关闭了;关闭客户端是ctrl+c,进程直接就关闭了!!
多实例关闭,指定端口关闭:Redis-cli -p 6379 shutdown
概述:
端口号6379来自于Alessia Merz
默认16个数据库,相似数组下标从0开始,初始默认使用0号库
使用命令 select <dbid> 来切换数据库。如: select 8
统一密码管理,全部库都是一样密码,要么都OK要么一个也链接不上。
Redis是单线程+多路IO复用技术
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,好比调用select和poll函数,传入多个文件描述符,若是有一个文件描述符就绪,则返回,不然阻塞直到超时。获得就绪状态后进行真正的操做能够在同一个线程里执行,也能够启动线程执行(好比使用线程池)。
串行 vs 多线程+锁(memcached) vs 单线程+多路IO复用(Redis)
所有过来,一个个的进行服务,其余的要等着即串行;所有过来,每一个人前面都有人给服务,锁就是调酒师只能一个个来给他们调,没轮到的就先锁住了即多线程+锁;
所有过来,一我的给他们服务,但服务人员效率快(多路IO复用技术),立刻就服务完了,充分利用了CPU即单线程+多路IO复用;
keys * 查询当前库的全部键
exists <key> 判断某个键是否存在 type <key> 查看键的类型 del <key> 删除某个键 expire <key> <seconds> 为键值设置过时时间,单位秒。 ttl <key> 查看还有多少秒过时,-1表示永不过时,-2表示已过时 dbsize 查看当前数据库的key的数量 flushdb 清空当前库
[root@hadoop myredis]# redis-server redis.conf [root@hadoop myredis]# redis-cli 127.0.0.1:6379> 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> expire k1 30 (integer) 1 127.0.0.1:6379> ttl k1 (integer) 26 127.0.0.1:6379> ttl k1 (integer) 5 127.0.0.1:6379> ttl k1 (integer) -2 表示已过时;过时以后k1就会被从数据库中删除掉;
127.0.0.1:6379> keys *
(empty list or set)
get <key> 查询对应键值 set <key> <value> 只能添加1对键值对 添加键值对 append <key> <value> 将给定的<value> 追加到原值的末尾 strlen <key> 得到值的长度 setnx <key> <value> 只有在 key 不存在时才会设置key 的值; k v incr <key> 将 key 中储存的数字值增1 只能对数字值操做,若是为空,新增值为1 decr <key> 将 key 中储存的数字值减1 只能对数字值操做,若是为空,新增值为-1 incrby / decrby <key> <步长> 将 key 中储存的数字值增减。自定义步长。
127.0.0.1:6379> append k1 aaaaa (integer) 7 127.0.0.1:6379> get k1 "v1aaaaa" 127.0.0.1:6379> set k3 3 127.0.0.1:6379> type k2 string 127.0.0.1:6379> incr k3 (integer) 4 127.0.0.1:6379> get k3 "4" 127.0.0.1:6379> decr k3 (integer) 3 127.0.0.1:6379> get k3 "3" 127.0.0.1:6379> incrby k3 5 (integer) 8 127.0.0.1:6379> get k3 "8"
mset <key1> <value1> <key2> <value2> ..... 同时设置一个或多个 key-value对 mget <key1> <key2> <key3> ..... 同时获取一个或多个 value msetnx <key1> <value1> <key2> <value2> ..... 同时设置一个或多个 key-value 对,当且仅当全部给定 key 都不存在。 getrange <key> <起始位置> <结束位置> 得到值的范围,相似java中的substring setrange <key> <起始位置> <value> 用 <value> 覆写<key> 所储存的字符串值,从<起始位置>开始。 setex <key> <过时时间> <value> 设置键值的同时,设置过时时间,单位秒。 getset <key> <value> 以新换旧,设置了新值同时得到旧值。
lpush/rpush <key> <value1> <value2> <value3> .... 从左边/右边插入一个或多个值。 lpop/rpop <key> 从左边/右边吐出一个值。 值在键在,值亡键亡。吐出来就从原来的删除了 rpoplpush <key1> <key2> 从<key1>列表右边吐出一个值,插到<key2>列表左边。 lrange <key> <start> <stop> 按照索引下标得到元素(从左到右) lindex <key> <index> 按照索引下标得到元素(从左到右) llen <key> 得到列表长度 linsert <key> before <value> <newvalue> 在<value>的前面插入<newvalue> lrem <key> <n> <value> 从左边删除n个value(从左到右)
sadd <key> <value1> <value2> ..... 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。 smembers <key> 取出该集合的全部值。 sismember <key> <value> 判断集合<key>是否为含有该<value>值,有返回1,没有返回0 scard <key> 返回该集合的元素个数。 srem <key> <value1> <value2> .... 删除集合中的某个元素。 spop <key> [count] 随机从该集合中吐出一个值。吐出就删除掉了 srandmember <key> <n> 随机从该集合中取出n个值。 不会从集合中删除 sinter <key1> <key2> 返回两个集合的交集元素。 sunion <key1> <key2> 返回两个集合的并集元素。 sdiff <key1> <key2> 返回两个集合的差集元素。
hset <key> <field> <value> 给<key>集合中的 <field>键赋值<value> hget <key1> <field> 从<key1>集合<field> 取出 value hmset <key1> <field1> <value1> <field2> <value2>... 批量设置hash的值 hexists key <field> 查看哈希表 key 中,给定域 field 是否存在。 hkeys <key> 列出该hash集合的全部field hvals <key> 列出该hash集合的全部value hincrby <key> <field> <increment> 为哈希表 key 中的域 field 的值加上增量 increment hsetnx <key> <field> <value> 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .
Redis有序集合zset与普通集合set很是类似,是一个没有重复元素的字符串集合。不一样之处是有序集合的全部成员都关联了一个评分(score) ,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是惟一的,可是评分能够是重复了 。
由于元素是有序的, 因此你也能够很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是很是快的,所以你可以使用有序集合做为一个没有重复成员的智能列表。
zadd <key> <score1> <value1> <score2> <value2>... 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。 zrange <key> <start> <stop> [WITHSCORES] 返回有序集 key 中,下标在<start> <stop>之间的元素 带WITHSCORES,可让分数一块儿和值返回到结果集。 zrangebyscore key min max [withscores] [limit offset count] 返回有序集 key 中,全部 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 zrevrangebyscore key max min [withscores] [limit offset count] 同上,改成从大到小排列。 zincrby <key> <increment> <value> 为元素的score加上增量 zrem <key> <value> 删除该集合下,指定值的元素 zcount <key> <min> <max> 统计该集合,分数区间内的元素个数 zrank <key> <value> 返回该值在集合中的排名,从0开始。
Jedis所需的jar包
Commons-pool-1.6.jar
Jedis-2.1.0.jar
windows中的Eclipse链接虚拟机的Redis的注意事项
禁用Linux的防火墙:
临时禁用:service iptables stop
关闭开机自启:chkconfig iptables off
redis.conf中注释掉bind 127.0.0.1(61行) ,而后 protect-mode(80行)设置为 no。
public class TestJedis { Jedis jedis = new Jedis("192.168.1.100", 6379); public void main(String[] args) { } //测试链接是否成功 @Test void test1() { System.out.println("Connection success:" + jedis.ping()); } }