Redis数据库 01概述| 五大数据类型

 

一、NoSQL数据库简介

解决应用服务器的CPU和内存压力;解决数据库服务的IO压力;java

----->>> ① session存在缓存数据库(彻底在内存里),速度快且数据结构简单;c++

打破了传统关系型数据库业务逻辑为依据的存储模式,而针对不一样数据结构类型改成以性能为最优先的存储方式--非关系型数据库K, Vredis

② 缓存数据库:减小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、 listset、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

Redis是一个开源的key-value存储系统。和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。在此基础上,Redis支持各类不一样方式的排序。与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步。

  • 一、配合关系型数据库作高速缓存
  • 高频次,热门访问的数据,下降数据库IO
  • 分布式架构,作session共享
  • 二、因为其拥有持久化能力,利用其多样的数据结构存储特定的数据。

 

三、Redis3.2.5 for Linux的安装

  一、下载得到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复用;

四、 Redis五大数据类型

 

  key

 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)

① String

  • String是Redis最基本的类型,你能够理解成与Memcached如出一辙的类型,一个key对应一个value。
  • String类型是二进制安全的。意味着Redis的string能够包含任何数据。好比jpg图片或者序列化的对象 。
  • String类型是Redis最基本的数据类型,一个Redis中字符串value最多能够是512M
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"

原子性

  • 所谓原子操做是指不会被线程调度机制打断的操做;这种操做一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另外一个线程)。
  • (1) 在单线程中, 可以在单条指令中完成的操做均可以认为是" 原子操做",由于中断只能发生于指令之间。
  • (2)在多线程中,不能被其它进程(线程)打断的操做就叫原子操做。
  • Redis单命令的原子性主要得益于Redis的单线程
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> 以新换旧,设置了新值同时得到旧值。

② List

  • 单键多值
  • Redis 列表是简单的字符串列表,按照插入顺序排序。你能够添加一个元素到列表的头部(左边)或者尾部(右边)。
  • 它的底层实际是个双向链表,对两端的操做性能很高,经过索引下标的操做中间的节点性能会较差。
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(从左到右)

 

 ③ Redis set

  • Redis set对外提供的功能与list相似是一个列表的功能,特殊之处在于set是能够自动排重的,当你须要存储一个列表数据,又不但愿出现重复数据时,set是一个很好的选择,而且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
  • Redis的Set是string类型的无序集合。它底层实际上是一个value为null的hash表,因此添加,删除,查找的复杂度都是O(1)。
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> 返回两个集合的差集元素。

 

④ Redis hash

  • Redis  hash 是一个键值对集合。
  • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
  • 相似Java里面的Map<String,Object>
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

       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 值介于 minmax 之间(包括等于 minmax )的成员。有序集成员按 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开始。

 

五、 JAVA的Redis客户端Jedis

 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()); } }
相关文章
相关标签/搜索