NoSQL

摘自百度百科

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

NoSQL数据库的四大分类
1. 键值(Key-Value)存储数据库
    这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
2. 列存储数据库。
    这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
3. 文档型数据库
    文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
4. 图形(Graph)数据库
    图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph.

因此,我们总结NoSQL数据库在以下的这几种情况下比较适用: 1、数据模型比较简单; 2、需要灵活性更强的IT系统; 3、对数据库性能要求较高; 4、不需要高度的数据一致性; 5、对于给定key,比较容易映射复杂值的环境。

Redis 简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库,也是NoSQL数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。

Redis 优势

1. 性能极高 – 官方对redis进行测试,50个并发执行100000个请求,Redis读的速度是110000次/s,写的速度是81000次/s 。
2. 丰富的数据类型 redis是基于key/value形式进行存储 redis可以存储五种数据类型(注意:redis中的key/value均区分大小写)
    * String      字符串
    * Hash        哈希类型 类似Java中的HashMap类型
    * List        链表
    * Set         集合
    * Sorted Set  有序集合 (也称zset)
3. 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
4. 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis与其他key-value存储有什么不同?

1. Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。

2. Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

redis 使用

redis的windows客户端端使用

Redis命令十分丰富,包括的命令组有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14个redis命令组两百多个redis命令,如果您有兴趣请上redis官网查看全部的redis命令,在这里我们只针对redis的常用命令以及五种数据类型相关的命令进行操作
1.启动redis-server.exe 服务器端
2.打开redis-cli.exe 客户端

redis的常用命令(redis中的key和value都区分大小写)

String类型的指令

    1. 存储: set key value
            127.0.0.1:6379> set username laowang
            OK
    2. 获取: get key
            127.0.0.1:6379> get username
            "laowang"
    3. 删除: del key
            127.0.0.1:6379> del username
            (integer) 1

Hash类型的指令
    1. 存储: hset key field value
            127.0.0.1:6379> hset myhash address beijing
            (integer) 1
            127.0.0.1:6379> hset myhash level one
            (integer) 1
    2. 获取:
            * hget key field: 获取指定的field对应的值
                127.0.0.1:6379> hget myhash level
                "one"
            * hgetall key:获取所有的field和value
                127.0.0.1:6379> hgetall myhash
                1) "address"
                2) "beijing"
                3) "level"
                4) "one"
    3. 删除: hdel key field
            127.0.0.1:6379> hdel myhash level
            (integer) 1

List类型的指令
    1. 添加:
        1. lpush key value: 将元素加入列表左侧
        2. rpush key value:将元素加入列表右侧
            127.0.0.1:6379> lpush myList 1
            (integer) 1
            127.0.0.1:6379> lpush myList 2
            (integer) 2
            127.0.0.1:6379> rpush myList 2
            (integer) 3
            127.0.0.1:6379> rpush myList 3
            (integer) 4
    2. 获取:lrange key start end :范围获取 (0 -1 指获取所有)
            127.0.0.1:6379> lrange myList 0 -1
            1) "2"
            2) "1"
            3) "2"
            4) "3"
    3. 删除:
        1. lpop key: 删除列表最左边的元素,并将元素返回
        2. rpop key: 删除列表最右边的元素,并将元素返回
            127.0.0.1:6379> lpop myList
            "2"
            127.0.0.1:6379> rpop myList
            "3"

Set类型的指令 set类型的value是唯一的
    1. 存储:sadd key value
            127.0.0.1:6379> sadd myset one
            (integer) 1
            127.0.0.1:6379> sadd myset one
            (integer) 0
            127.0.0.1:6379> sadd myset ONE
            (integer) 1
    2. 获取:smembers key:获取set集合中所有元素
            127.0.0.1:6379> smembers myset
            1) "one"
            2) "ONE"
    3. 删除:srem key value:删除set集合中的某个元素
            127.0.0.1:6379> srem myset ONE
            (integer) 1

Sorted Set类型的指令
    1. 存储:zadd key score value
            127.0.0.1:6379> zadd mysort 666 laotie
            (integer) 1
            127.0.0.1:6379> zadd mysort 66 meimaobing
            (integer) 1
            127.0.0.1:6379> zadd mysort 6 chenduxiu
            (integer) 1
    2. 获取:zrange key start end [withscores]
            127.0.0.1:6379> zrange mysort 0 -1
            1) "chenduxiu"
            2) "meimaobing"
            3) "laotie"

            127.0.0.1:6379> zrange mysort 0 -1 withscores
            1) "chenduxiu"
            2) "6"
            3) "meimaobing"
            4) "66"
            5) "laotie"
            6) "666"
    3. 删除:zrem key value
            127.0.0.1:6379> zrem mysort laotie
            (integer) 1

其他常用的指令 :

    1. dbsize :返回当前数据库的 key 的数量。
        127.0.0.1:6379> dbsize
        (integer) 2


    2. Keys pattern:查找所有符合给定模式 pattern 的 key 。
        在redis中存值
        127.0.0.1:6379> set One1 redis
        OK
        127.0.0.1:6379> set One2 mysql
        OK
        127.0.0.1:6379> set One3 oracle
        OK
        127.0.0.1:6379> set One4 mongodb
        OK


        127.0.0.1:6379> keys One*
        1) "One3"
        2) "One4"
        3) "One1"
        4) "One2"


        127.0.0.1:6379> keys * (该指令不建议使用)
        1) "myhash"
        2) "One3"
        3) "One4"
        4) "One1"
        5) "One2"
        6) "mysort"


    3. del key [key …] :删除给定的一个或多个key,以及对应的value,不存在的 key 会被忽略,该指令可以将任意数据类型删除
        127.0.0.1:6379> del One1 One2
        (integer) 2

    4. type key :返回 key 所储存的值的类型。
        127.0.0.1:6379> type mysort
        zset
        127.0.0.1:6379> type myhash
        hash
        127.0.0.1:6379> type One3
        string

    5. exists key :检查指定key是否存在
        127.0.0.1:6379> exists hehe
        (integer) 0
        127.0.0.1:6379> exists myhash
        (integer) 1

    6. expire key seconds:为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。seconds的单位为秒。
        127.0.0.1:6379> expire One3 20
        (integer) 1
        127.0.0.1:6379> get One3
        "oracle"
        127.0.0.1:6379> get One3
        "oracle"
        127.0.0.1:6379> get One3
        "oracle"
        127.0.0.1:6379> get One3
        (nil)

    7. ttl key  以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
       当 key 不存在时,返回 -2 。
       当 key 存在但没有设置剩余生存时间时,返回 -1 。
       否则,以秒为单位,返回 key 的剩余生存时间。

        127.0.0.1:6379> set myTtl myRedis
        OK
        127.0.0.1:6379> set myTtl2 myRedis2
        OK
        127.0.0.1:6379> expire myTtl 30
        (integer) 1
        127.0.0.1:6379> ttl myTtl
        (integer) 20
        127.0.0.1:6379> ttl myRedis
        (integer) -2
        127.0.0.1:6379> ttl myTtl2
        (integer) -1

    8. flushall:清空整个 Redis 服务器的数据(删除所有数据库的所有 key ),此命令从不失败。
       flushdb :清空当前数据库中的所有 key,此命令从不失败。
        127.0.0.1:6379> flushdb
        OK
        127.0.0.1:6379> flushall
        OK
        127.0.0.1:6379> keys *
        (empty list or set)

欢迎各路大神批评指正
04-19 18:37