• redis(二)入门和数据类型的简单介绍


    redis是什么?

      C写的开源基于内存的高性能非关系型键值对数据库。底层采取epoll读写速度非常快,大多用于缓存,也提供了事务、持久化、分布式锁、消息队列、集群以及多种数据类型的功能。

    什么时候需要用到redis?

      首先我们明确几个常识问题:磁盘寻址是ms级别,带宽为G/M级别。而内存的寻址是n/s级别,在寻址上磁盘比内存慢了10W倍,内存的带宽也特别大。I/O buffer:磁盘有磁道和扇区,一个扇区512Byte带来成本变大:索引,

    所以操作系统每次读取磁盘都是读取4K,无论读多少都是4K。总的来说就是内存比磁盘快很多,对于磁盘的读取的最小单位是4K。

      我们知道传统的关系型数据库,这里以mysql为例子,数据都是存储在磁盘的。当数据量越来越大的时候,必然会出现I/O瓶颈,当并发量大的时候,硬盘带宽的限制也十分明显。当然索引可以解决一部分问题,我们先来大致

    分析mysql索引的实现原理。mysql的会在内存中维护一个B+树,树的每个节点维护对应索引的区间,这些区间和磁盘中具体的索引信息对应,这些具体的索引信息又和磁盘中的具体存储的数据进行对应。所以假设在查询的时候,如果

    数据量很小且命中索引的情况就下,数据量增大几乎没什么影响。但是当查询的数据量很大,且并发很大的时候,mysql数据库就会受制于I/O和带宽的限制,性能会受到极大的影响。

      这个时候,我们就需要用到缓存,来缓解关系型数据库的压力。常用的缓存架构有memcached和redis,我们先来看看memcached和redis的区别:

    1. redis可以存储的数据类型十分丰富,下面会介绍。但是memcached没用数据类型的概念。(计算向数据移动)

    2. 当物理内存满的时候,redis可以将不常用的数据swap到磁盘,而memcached不支持。

    3. 存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);

    4. 灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;

    5. Redis支持数据的备份,即master-slave模式的数据备份;

      从上面的对比,我们可以很清晰的看到redis的优势,所以现在memcached正在慢慢被淘汰,接下来,我们来看看为什么redis性能高。

    redis为什么快?

      首先redis对于数据的处理是单进程、单线程、单实例的,避免了多个线程切换带来的性能消耗。其次,其底层是通过linux kernel 的epplo实现的,效率极高。

    我们再来看linux的epplo是如何实现的,为什么效率这么高。

      

    如何在linux上使用redis:

      上一篇文章,介绍了如何在linux上安装redis,那么我们该如何使用它呢。在redi启动的情况下执行redis-cli命令,如图所示:

       每一个redis服务包含16个库,下标0-15。如果我们在往redis放入数据的时候,不指定库,那么默认使用0库,我们来看看如何往指定数据库存入数据

    执行select index命令(index为数据库的下标),比如我要切换到下标为2的数据库,如下图所以,切换之后会多一个2的标识:

       我们来看看如何使用redis的命令,输入help命令,如下图所示:

       这里介绍了如何通过help来学习redis的命令,help @<group>指的是可以查看redis各个分组的命令,Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个redis命令,想要详细了解的话,参考http://www.redis.cn/commands.html。help后面还可以直接跟你想要了解的命令,还可以通过tab自动补全,这里也指出了通过quit可以退出redis客户端。

    redis key的简单介绍:

      我们都知道redis是key-value型的数据库,那么redis对key有什么限制呢?

      Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,空字符串也是有效key值。redis的key需满足以下规则:

    • 键值不能太长,例如1024字节的键值就不合适,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。
    • 太短的键值也不合适,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对于key object和value object本身来说很小。当然,没人阻止您一定要用更短的键值节省一丁点儿空间。
    • 最好坚持一种模式。例如:”object-type:id:field”就是个不错的注意,像这样”user:1000:password”。我喜欢对多单词的字段名中加上一个点,就像这样:”comment:1234:reply.to”。(这个是官网的描述,我一般使用都是通过下划线隔开,比如user_1000_password)

    redis的数据类型的简单介绍:

    • Strings:二进制安全的字符串。
    • Lists: 按插入顺序排序的字符串元素的集合。他们基本上就是链表(linked lists)
    • Sets: 不重复且无序的字符串元素的集合。
    • Sorted sets,类似Sets,但是每个字符串元素都关联到一个叫score浮动数值(floating number value)。里面的元素总是通过score进行着排序,所以不同的是,它是可以检索的一系列元素。(例如你可能会问:给我前面10个或者后面10个元素)。
    • Hashes,由field和关联的value组成的map。field和value都是字符串的。这和Ruby、Python的hashes很像。
    • Bit arrays (或者说 simply bitmaps): 通过特殊的命令,你可以将 String 值当作一系列 bits 处理:可以设置和清除单独的 bits,数出所有设为 1 的 bits 的数量,找到最前的被设为 1 或 0 的 bit,等等。
    • HyperLogLogs: 被用于估计一个 set 中元素数量的概率性的数据结构。
  • 相关阅读:
    c/c++混编
    inotify监听文件
    二维数组
    CentOS7 修改系统时间
    书签书签
    c语言并行程序设计之路(四)(barrier的实现和条件变量)
    MPI分布式内存编程(一):预备知识
    有些狮子不喝咖啡:条件式与合取式的翻译
    【部分博客已搬家至博客园】对CSDN、博客园和简书的一点比较
    c语言并行程序设计之路(三)(信号量与同步)
  • 原文地址:https://www.cnblogs.com/liu-yi/p/14319564.html
Copyright © 2020-2023  润新知