zoukankan      html  css  js  c++  java
  • 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暂未学习

  • 相关阅读:
    [转]批处理for命令使用指南
    批处理命令学习
    【树】Count Complete Tree Nodes
    【树】Flatten Binary Tree to Linked List(先序遍历)
    【树】Kth Smallest Element in a BST(递归)
    巧用border特性实现聊天气泡效果
    【树】Lowest Common Ancestor of a Binary Tree(递归)
    【树】Path Sum II(递归)
    【树】Populating Next Right Pointers in Each Node
    【树】Serialize and Deserialize Binary Tree
  • 原文地址:https://www.cnblogs.com/FanJava/p/9636511.html
Copyright © 2011-2022 走看看