Redis学习记录

在学习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。如果我们是在链表的两头插入或者删除元素,效率非常高,技师链表中已经存储了百万条数据,该操作也可以在常量时间内完成;但是如果元素插入或删除操作在链表中间,那将会非常低效。

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

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

猜你喜欢

转载自www.cnblogs.com/FanJava/p/9636511.html