您的位置:首页 > 数据库 > Redis

redis缓存数据库

2016-09-20 23:09 99 查看

缓存数据库介绍

NoSQL(NoSQL=NotOnlySQL),意即“不仅仅是SQL”,泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

NoSQL数据库的四大分类

键值(Key-Value)存储数据库

这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。[3]举例如:TokyoCabinet/Tyrant,Redis,Voldemort,OracleBDB.

列存储数据库。
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra,HBase,Riak.

文档型数据库
文档型数据库的灵感是来自于LotusNotes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB,MongoDb.国内也有文档型数据库SequoiaDB,已经开源。

图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。[2]如:Neo4J,InfoGrid,InfiniteGraph.
因此,我们总结NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。

NoSQL数据库的四大分类表格分析

分类Examples举例典型应用场景数据模型优点缺点
键值(key-value)[3]TokyoCabinet/Tyrant,Redis,Voldemort,OracleBDB内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。[3]Key指向Value的键值对,通常用hashtable来实现[3]查找速度快数据无结构化,通常只被当作字符串或者二进制数据[3]
列存储数据库[3]Cassandra,HBase,Riak分布式的文件系统以列簇式存储,将同一列数据存在一起查找速度快,可扩展性强,更容易进行分布式扩展功能相对局限
文档型数据库[3]CouchDB,MongoDbWeb应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容)Key-Value对应的键值对,Value为结构化数据数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构查询性能不高,而且缺乏统一的查询语法。
图形(Graph)数据库[3]Neo4J,InfoGrid,InfiniteGraph社交网络,推荐系统等。专注于构建关系图谱图结构利用图结构相关算法。比如最短路径寻址,N度关系查找等很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。[3]

redis

介绍

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

Redis优点

异常快速:Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。

支持丰富的数据类型:Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。

这使得在应用中很容易解决的各种问题,因为我们知道哪些问题处理使用哪种数据类型更好解决。

操作都是原子的:所有Redis的操作都是原子,从而确保当两个客户同时访问Redis服务器得到的是更新后的值(最新值)。

MultiUtility工具:Redis是一个多功能实用工具,可以在很多如:缓存,消息传递队列中使用(Redis原生支持发布/订阅),在应用程序中,如:Web应用程序会话,网站页面点击数等任何短暂的数据;

安装Redis环境

要在Ubuntu上安装Redis,打开终端,然后输入以下命令:
$sudoapt-getupdate
$sudoapt-getinstallredis-server

这将在您的计算机上安装Redis
启动Redis

$redis-server

查看redis是否还在运行

$redis-cli

这将打开一个Redis提示符,如下图所示:
redis127.0.0.1:6379>

在上面的提示信息中:127.0.0.1是本机的IP地址,6379是Redis服务器运行的端口。现在输入PING命令,如下图所示:
redis127.0.0.1:6379>ping
PONG

这说明现在你已经成功地在计算机上安装了Redis。

RedisAPI使用

redis-py的API的使用可以分类为:

连接方式

连接池

操作

String操作

Hash操作

List操作

Set操作

SortSet操作

管道

发布订阅

连接方式

1、操作模式

redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。

2、连接池

redis-py使用connectionpool来管理对一个redisserver的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。

操作

1.String操作

redis中的String在在内存中按照一个name对应一个value来存储。如图:



set(name,value,ex=None,px=None,nx=False,xx=False)

setnx(name,value)

setex(name,value,time)



psetex(name,time_ms,value)

mset(*args,**kwargs)

get(name)

mget(keys,*args)

getset(name,value)

getrange(key,start,end)

setrange(name,offset,value)

setbit(name,offset,value)

*用途举例,用最省空间的方式,存储在线用户数及分别是哪些用户在线

getbit(name,offset)

bitcount(key,start=None,end=None)

strlen(name)

incr(self,name,amount=1)

incrbyfloat(self,name,amount=1.0)

decr(self,name,amount=1)

append(key,value)

  

2.Hash操作

hash表现形式上有些像pyhton中的dict,可以存储一组关联性较强的数据,redis中Hash在内存中的存储格式如下图:  



hset(name,key,value)

hmset(name,mapping)

hget(name,key)

hmget(name,keys,*args)

hgetall(name)

hlen(name)

hkeys(name)

hvals(name)

hexists(name,key)

hdel(name,*keys)

hincrby(name,key,amount=1)

hincrbyfloat(name,key,amount=1.0)

hscan(name,cursor=0,match=None,count=None)

Startafullhashscanwith:

HSCANmyhash0


Startahashscanwithfieldsmatchingapatternwith:

HSCANmyhash0MATCHorder_*


Startahashscanwithfieldsmatchingapatternandforcingthescancommandtodomorescanningwith:

HSCANmyhash0MATCHorder_*COUNT1000




hscan_iter(name,match=None,count=None)

3.list

List操作,redis中的List在在内存中按照一个name对应一个List来存储。如图:  



lpush(name,values)

lpushx(name,value)

llen(name)

linsert(name,where,refvalue,value))

r.lset(name,index,value)

r.lrem(name,value,num)

lpop(name)

lindex(name,index)

lrange(name,start,end)

ltrim(name,start,end)

rpoplpush(src,dst)

blpop(keys,timeout)

brpoplpush(src,dst,timeout=0)

4.set集合操作


Set操作,Set集合就是不允许重复的列表

sadd(name,values)

scard(name)

sdiff(keys,*args)

sdiffstore(dest,keys,*args)

sinter(keys,*args)

sinterstore(dest,keys,*args)

sismember(name,value)

smembers(name)

smove(src,dst,value)

spop(name)

srandmember(name,numbers)

srem(name,values)

sunion(keys,*args)

sunionstore(dest,keys,*args)

sscan(name,cursor=0,match=None,count=None)
sscan_iter(name,match=None,count=None)


有序集合,在集合的基础上,为每元素排序;元素的排序需要根据另外一个值来进行比较,所以,对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。


zadd(name,*args,**kwargs)

zcard(name)

zcount(name,min,max)

zincrby(name,value,amount)

r.zrange(name,start,end,desc=False,withscores=False,score_cast_func=float)

zrank(name,value)



zrem(name,values)

zremrangebyrank(name,min,max)

zremrangebyscore(name,min,max)



zscore(name,value)

zinterstore(dest,keys,aggregate=None)

zunionstore(dest,keys,aggregate=None)

zscan(name,cursor=0,match=None,count=None,score_cast_func=float)
zscan_iter(name,match=None,count=None,score_cast_func=float)

其他常用操作


delete(*names)

exists(name)

keys(pattern='*')

expire(name,time)

rename(src,dst)

move(name,db))

randomkey()

type(name)

scan(cursor=0,match=None,count=None)
scan_iter(match=None,count=None)





管道

redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)一次连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline是原子性操作。



Python操作Redis

  

发布订阅



订阅:

importredis
pool=redis.ConnectionPool(host='192.168.14.35',port=6379,password="Alex3714",db=1)
r=redis.Redis(connection_pool=pool)

pub=r.pubsub()#打开收音机

pub.subscribe("fm87.7")#调台

pub.parse_response()#准备接收
print("准备监听...")

data=pub.parse_response()#正式接收
print(data)


发布:

importredis
pool=redis.ConnectionPool(host='192.168.14.35',port=6379,password="Alex3714",db=1)
r=redis.Redis(connection_pool=pool)

r.publish("fm87.7","bigSB!")


什么时候用关系型数据库,什么时候用NoSQL?

Goforlegacyrelationaldatabases(RDBMS)when:

Thedataiswellstructured,andlendsitselftoatabulararrangement(rowsandcolumns)inarelationaldatabase.Typicalexamples:bankaccountinfo,customerorderinfo,customerinfo,employeeinfo,departmentinfoetcetc.

Anotheraspectoftheabovepointis:schemaorienteddatamodel.Whenyoudesignadatamodel(tables,relationshipsetc)forapotentialuseofRDBMS,youneedtocomeupwithawelldefinedschema:therewillbethesemanytables,eachtablehavingaknownsetofcolumnsthatstoredatainknowntypedformat(CHAR,NUMBER,BLOBetc).

VeryImportant:Considerwhetherthedataistransactionalinnature.Inotherwords,whetherthedatawillbestored,accessedandupdatedinthecontextoftransactionsprovidingtheACIDsemanticsorisitokaytocompromisesome/alloftheseproperties.

Correctnessisalsoimportantandanycompromiseis_unacceptable_.ThisstemsfromthefactthatinmostNoSQLdatabases,consistencyistradedoffinfavorofperformanceandscalability(pointsonNoSQLdatabasesareelaboratedbelow).

Thereisnostrong/compellingneedforascaleoutarchitecture;adatabasethatlinearlyscalesout(horizontalscaling)tomultiplenodesinacluster.

Theusecaseisnotfor“highspeeddataingestion”.

Iftheclientapplicationsareexpectingtoquicklystreamlargeamountsofdatain/outofthedatabasethenrelationaldatabasemaynotbeagoodchoicesincetheyarenotreallydesignedforscalingwriteheavyworkloads.

InordertoachieveACIDproperties,lotsofadditionalbackgroundworkisdoneespeciallyinwriter(INSERT,UPDATE,DELETE)codepaths.Thisdefinitelyaffectsperformance.

Theusecaseisnotfor“storingenormousamountsofdataintherangeofpetabytes”.

GoforNoSQLdatabaseswhen:

Thereisnofixed(andpredetermined)schemathatdatafitsin:

Scalability,Performance(highthroughputandlowoperationlatency),ContinuousAvailabilityareveryimportantrequirementstobemetbytheunderlyingarchitectureofdatabase.

Goodchoicefor“HighSpeedDataIngestion”.Suchapplications(forexampleIoTstyle)whichgeneratemillionsofdatapointsinasecondandneedadatabasecapableofprovidingextremewritescalability.

Theinherentabilitytohorizontallyscaleallowstostorelargeamountsofdataacrosscommodityserversinthecluster.Theyusuallyuselowcostresources,andareabletolinearlyaddcomputeandstoragepowerasthedemandgrows.

sourcepagehttps://www.quora.com/When-should-you-use-NoSQL-vs-regular-RDBMS
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航