在学习Redis之前,要知道什么是NoSQL?

1.NoSQL

1.1. 什么是NoSQL

NoSQL(NoSQL = Not Only SQL),表示“不仅仅是SQL”,泛指非关系型数据库。

1.2. 为什么需要NoSQL

在面对超大规模和高并发的web2.0纯动态网站,暴露了很多难以克服的问题:

(1)High performance —— 对数据库高并发读写的需求

web2.0网站需要根据用户个性化信息来实时生成动态页面和提供动态信息,因此数据库并发负载非常高,往往需要达到每秒钟上万次读写需求。而不同的关系型数据库应付上万次SQL查询才能够勉强顶住,但是对于上万次SQL读写操作,硬盘IO就无法承受。

(2)Huge Storage —— 对海量数据的高效率存储和访问的需求

在一些大型的web网站中,每天用户量产生上亿的用户动态,这对于关系型数据库来说,在上亿条记录的表中进行SQL查询,效率极其低下。

(3)High Scalability && High Availability——对数据库的高可扩展性和高可用性的需求

在基于web的网络架构中,数据库是最难进行横向扩展的。当用户量和访问量与日俱增时,你的数据库没有办法简单的添加服务节点来扩展性能和负载能力,尤其对于那些提供24小时服务的网站来说,对数据库系统进行升级和扩展非常困难,往往需要停机维护和数据迁移。

所以综上所述,NoSQL数据库的产生是为了解决大规模数据集合多重数据种类带来的挑战。

1.3 主流NoSQL

NoSQL数据库主要分为四大类:

(1)  键值(key-value)存储数据库

  相关产品:Redis

  典型应用:内容缓存,主要用于处理大量数据的高访问负载

  优势:快速查询

  劣势:存储的数据缺少结构化

(2)  列存储数据库

  相关产品:HBase

  典型应用:分布式的文件系统

  优势:查找树杜快,可扩展性强,更容易进行分布式扩展

  劣势:功能相对局限

(3)  图形存储数据库

  相关产品:Neo4J,InfoGrid, Infinite Graph

  典型应用:社交网络

  优势:图结构

  劣势:需要对整个图进行计算才能得出结果,不容易做分布式的集群方案

(4)  文档型存储数据库

  相关产品:MongoDB

  典型应用:Web应用(与Key-Value类似,Value是结构化的)

  优势:数据结构要求不严格

  劣势:查询性能不高,而且缺乏统一的查询愈发

1.3 NoSQL的特点

(1) 易扩展性

  NoSQL数据库都有一个共同的特点,都去掉了关系数据库的关系型特性。数据之间无关系,容易扩展。

(2) 大数据量,高性能

  NoSQL数据库都具有非常高的读写性能,也得益于它的无关系特性,数据库结构简单

(3) 灵活的数据模型

  NoSQL无需事先为要存储的数据简历字段,随时可以存储自定义的数据格式。而在关系型数据库中,增删字段非常麻烦,尤其是非常大数据量的表,增加字段简直就是噩梦

(4) 高可用

  NoSQL在不太影响性能的情况下,就可以方便的实现高可用的架构。

2.Redis

2.1 什么是redis

  redis是用C语言开发的一个开源的高性能键值对数据库。目前为止redis支持的键值数据类型:

  (1) 字符串类型

  (2) 散列类型

  (3) 列表类型

  (4) 集合类型

  (5) 有序集合类型

官方提供测试数据:50个并发执行1000000个请求,读的速度为110000次/s,写的素的是81000次/s 。

2.2 redis的应用场景

  (1) 缓存(数据查询,短连接,新闻内容,商品内容)。(最多使用)

  (2) 聊天室的在线好友列表

  (3) 任务队列(秒杀,抢购)

  (4) 应用排行榜

  (5) 网站访问统计

  (6) 数据过期处理(可以精确到毫秒)

  (7) 分布式集群架构中的session分离

2.3Redis的安装

安装步骤:

第一步:redis的源码包上传到linux系统。

第二步:解压缩redis。

第三步:编译。进入redis源码目录。make

第四步:安装。make install PREFIX=/usr/local/redis

PREFIX参数指定redis的安装目录。一般软件安装到/usr目录下

2.3.1. 连接redis

2.3.1.1 redis的启动:

前端启动:在redis的安装目录下直接启动redis-server

[root@localhost bin]# ./redis-server

后台启动:

把/root/redis-3.0.0/redis.conf复制到/usr/local/redis/bin目录下

[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis/bin/

修改配置文件:

[root@localhost bin]# ./redis-server redis.conf

查看redis进程:

[root@localhost bin]# ps aux|grep redis

root      5190  0.1  0.3  33936  1712 ?        Ssl  18:23   0:00 ./redis-server *:6379

root      5196  0.0  0.1   4356   728 pts/0    S+   18:24   0:00 grep redis

[root@localhost bin]#

2.3.2. Redis-cli

[root@localhost bin]# ./redis-cli

默认连接localhost运行在6379端口的redis服务。

[root@localhost bin]# ./redis-cli -h 192.168.25.153 -p 6379

-h:连接的服务器的地址

-p:服务的端口号

关闭redis:[root@localhost bin]# ./redis-cli shutdown

2.3.3. 想redis服务器发送命令

字符串类型数据存储:该类型是redis中最为基础的数据存储类型,它在redis中是二进制安全的,这意味着该类型可以接受任何格式的数据;

在redis中字符穿类型的value最多可以容纳数据长度是512m。

(1) set/get,使用set和get可以向redis设置数据,获取数据

(2) del,删除指定key的内容

(3) keys * ,查看当前库中所有的key值

(4) incr:加一(生成id)

(4) decr:减一

hash数据类型存储:redis中的hash类型可以看成String Key和 StringValue的map容器。所以该类型非常适合于存储对象的信息。

如果hash中包含很少的字段,那么该类型的数据也将占用很少的磁盘空间。每隔hash可以存储4294967295个键值对。

(1) hset/hget向hash中添加/取内容

(2) hkeys hash查看hash中所有的key

(3)hvals hahs查看hash中所有的值

(4)hgetall hash查看hash中所有的key-val

(5)hdel hash field 删除hash中的键值

list数据类型存储:在redis中,list类型是按照插入顺序排序的字符串联表。我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键不存在,redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素都被移除,那么该键也将会被从数据库中删除。list可以包含最大元素是4294967285。如果我们是在链表的两头插入或者删除元素,效率非常高,假设链表中已经存储了百万条数据,该操作也可以在常量时间内完成;但是如果元素插入或删除操作在链表中间,那将会非常低效。

(1)lpush list 向list集合中从左边添加元素

元素位置为6,5,4,3,2,1

(2)rpush list 向list集合中从右边添加元素

(3)lrange list 0 -1遍历list集合从第一个元素(0)到最后一个元素(-1)

(4)lpop list 从list集合弹出头部元素,弹出之后list集合中不存在该元素

(5)rpop list 从list集合弹出尾部元素

(6)llen list 获取list中元素的个数

set数据类型存储:在redis中,set类型看做没有排序的字符集合,和list类型一样。在该类型的数据之上执行添加,删除或者判断某一元素是否存在等操作,所需时间都是常量时间。set可包含最大元素是4294967295。set集合不允许出现重复的元素,而且与list不同在服务端可以完成多个sets之间的聚合计算操作。如unions,intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。

使用场景:

(1) 跟踪一些唯一性数据,比如访问某一博客的唯一ip地址信息。

(2) 充分利用set类型的服务端集合操作方便,高效的特性,可以用于维护数据对象之间的关联关系。比如所有购买某一电子设备的客户id被存储在一个指定的set中,而购买另外一种电子产品的客户id被存储在另一个set中,如果此时我们想获取有哪些客户同时购买了这两种商品,set intersections命令就有很大的优势。

常用命令:

(1)sadd set 向set中添加元素,如果该元素已有,则不能重复添加

(2)srem set 删除set中指定成员

(3)smembers set 获取set中所有的成员

(4)sismember set 判断参数中指定成员是否在该set中,1表示存在,0表示不存在或者该key本身就不存在(无论元素中有多少元素都可以极速的返回结果)

set集合还能进行集合运算

(1) A∩B(属于A且属于B的元素构成的集合)

sinter list1 list2

(2)A∪B(属于A或者属于B的元素构成的集合)

sunion list1 list2

sortedset数据类型存储:与sets类型极为相似,都是字符串的集合,也不允许于出现重复的成员。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分 数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然 而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score) 却是可以重复的。在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为 集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此, 即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一 特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis 同样的高效,在其它数据库中进行建模是非常困难的。例如:游戏排名、微博热点话题等使用场景。

sortedset暂未学习

Redis学习记录(一)的更多相关文章

  1. redis 学习记录

    http://www.yiibai.com/redis/redis_quick_guide.html Redis 是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and s ...

  2. Redis学习记录之Java中的初步使用

    1.关于Redis redis下载地址:<span style="font-family: Arial, Helvetica, sans-serif;">http:// ...

  3. Redis学习记录

    参考资料: http://www.dengshenyu.com/%E5%90%8E%E7%AB%AF%E6%8A%80%E6%9C%AF/2016/01/09/redis-reactor-patter ...

  4. Redis学习记录之————微博项目

    Key设计 全局相关的key: 表名 global 列名 操作 备注 Global:userid incr 产生全局的userid Global:postid Incr 产生全局的postid 用户相 ...

  5. Redis学习记录(三)

    1.Redis集群的搭建 1.1redis-cluster架构图 架构细节: (1)所有的redis节点批次互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail ...

  6. Redis学习记录(二)

    1.Key命令 设置key的过期时间. expire key second:设置key的过期时间 ttl key:查看key的有效期(如果显示正数说明该key正在倒计时,如果是-1说明该key永久保存 ...

  7. Redis学习记录及Jedis代码示例

    文章目录 二.Redis简介 三.Redis安装 1. 下载并解压安装 2. 安装C语言编译环境 3. 修改安装位置 4. 编译安装 5.启动Redis服务器 ①默认启动 ②定制配置项启动 [1]准备 ...

  8. redis学习记录1 特性与优点

    1.存储结构:字符串.散列.列表.集合.有序集合. redis存储结构的优势:数据在redis中的储存方式和其在程序中的储存方式相近:redis对不同数据类型提供非常方便的操作方式,如使用集合类型储存 ...

  9. Redis——学习之路四(初识主从配置)

    首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...

随机推荐

  1. Filter的使用及其生命周期介绍

    一.Filter 1. Filter简介 > Filter翻译为中文是过滤器的意思. > Filter是JavaWeb的三大web组件之一:Servlet.Filter.Listener ...

  2. [USACO1.4]等差数列 Arithmetic Progressions

    题目描述 一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)的数列. 在这个问题中a是一个非负的整数,b是正整数.写一个程序来找出在双平方数集合(双 ...

  3. Java基础笔记(十四)——面向对象(续)【构造方法和this关键字】

    一.构造函数的规则 1.构造方法是用来在对象实例化时初始化对象的成员变量的,以完成对象的初始化工作. 2.构造方法与类名相同且没有返回值(返回值也不能为void型).如:public 构造方法名( ) ...

  4. Exadata 上关于SAS盘的小秘密

    案例概述 一个X3-2 的Exadata临时客户,ORACLE原厂工程师在进行onecommand初始化的过程中,执行到第6步,calibrate检测存储节点磁盘性能时报错,后续工作无法继续.而由于一 ...

  5. css奇技淫巧之—多列等高

    什么是等高布局? 先来看一个案例: 上图中的页面的主体内容是两列结构,左列是用来导航的,右列是用来显示内容的.我们看到它们有一个共同的边框,中间还有一条分隔线,左右两列的高度都是不固定的.这种情况下就 ...

  6. return this链式操作

    function Fn(){}; Fn.prototype = { constructor:Fn, a:function(){ alert(1); return this; //实现链式操作.即fn. ...

  7. JS异步解决方案之概念理解-----------阻塞和非阻塞,同步和异步,并发和并行,单线程和多线程

    首先记住一句话,JS是单线程的. 单线程意味着什么?单线程意味着 它不能依靠自己实现异步. JS实现的异步,往往都是靠 浏览器.Node 的机制(事件驱动.回调)实现的. 下面让我这个单身狗 以谈恋爱 ...

  8. 4、kvm相关网卡操作(添加、删除)

    查看虚拟机的网卡信息 virsh domiflist privi-server 添加临时网卡 virsh attach-interface privi-server --type bridge --s ...

  9. Luogu P3223 [HNOI2012]排队 组合

    本来做了一道  P4901 排队 后来发现自己做错题了...到也都是数学qwq 这题最恶心的就是两只(雾)老师. 那我们分类讨论: 1.两个老师之间是男生: $ A(n,n)*A(n+1,2)*A(n ...

  10. Linux--7

    一.Nginx.conf主配置文件 Nginx主配置文件conf/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的.一般,每个区块以一对大括号{}来表示开始与结束. 核心模 ...