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