一.NoSQL

关系型数据库的强大是毋庸置疑的,但关系型数据库的速度,尤其是对于大量数据的插入,较为耗时,只是我们可以了解一波NoSQL。在Web2.0时代,尤其重要

对于非关系型数据库而言,主流的NoSQL产品mongoDB,Redis都是很不错的起手选择。

了Redis前,先了解一下NoSQL

NoSQL数据库主要有四大分类:

    1.键值存储数据库

        典型应用:内容缓存,主要用于处理大量数据的高访问负载

           数据模型:键值对

            特点:查询速度快,但是数据的存储缺少结构化

    2 、列存储数据库

            典型应用:分布式文件系统

            数据模型:列簇式存储

            特点:查找速度快,可扩展性强,就是功能相对局限

    3.文档型数据库

            典型应用:Web应用

            数据模型:一系列键值对

               特点:对数据结构要求不严格,但是查询性能不高,也没有一个统一的查询语法

     4.图形数据库:

                典型应用:社交网络

                数据结构:图结构

                特点:可以利用图结构相算法,不过要对整个图进行计算,不好做一个分布式的集群方案


  NoSQL的主要优势:

    1.易扩展--->NoSQL数据库相对于关系型数据库,缺少了关系型数据库的关系型特性,数据之间无关系,就较易进行扩展

    2.大数据量,高性能---->读写性能很高,在大数据量下,读写性能依旧很高

    3.数据模式灵活---->无需事先为存储数据建立字段,随时可以存储自定义的数据格式吗,大数据量的表里添加字段依旧很轻松

    4.高可用--->在不太影响性能的情况下,就可以很方便的实现高可用的架构

二、Redis

2.1

        Redis简介:C语言开发的开源高性能键值对数据库,支持5种类型

  1.  字符串类型
  2. 散列类型         
  3. 列表类型
  4. 集合类型
  5. 有序集合类型

        redis的应用主要应用在缓存上,聊天室好友列表,排行榜等应用上也有较多的应用

    2.2

    对于安装,网上有较多的安装教程,我们根据其安装即可。在安装时我们注意要先安装gcc。在相关文件拷贝至/usr/local/redis/bin目录下,bin目录下,执行./redis-server redis.conf命令启动redis,./redis-cli打开,在6379端口下可以执行相关命令。在windows下也有对应的redis安装文件,但是所谓的windows下,也就是用了类似于Linux模拟器的东西,在其客户端页面,一些linux命令也能够执行

     2.3

        redis的set存储数据,get获取数据,较为简单,对于五种数据的相应操作,我们以下呈现

            2.3.1.String类型    

127.0.0.1:6379> set zhangsan a                 ---->set用于存储
OK
127.0.0.1:6379> get zhangsan                     ----->get获取
"a"
127.0.0.1:6379> get lisi                                    ------>nil为空
(nil)
127.0.0.1:6379> del zhangsan                       ------->del 根据键删除
(integer) 1
 127.0.0.1:6379> incr num                               -------->对键的值进行++,键不存在,值设为0,创建键,在++
(integer) 1
127.0.0.1:6379> decr num                                -------->键值--

(integer) 0      

127.0.0.1:6379> incrby num 5                          -------->num+5
(integer) 5
127.0.0.1:6379> decrby num 5                         ---------->num-5
(integer) 0
127.0.0.1:6379> append num 123                  ------------>追加字符串
(integer) 4
127.0.0.1:6379> get num
"0123"

            2.3.2储存hash

127.0.0.1:6379> hset myhash username zhangsan                       ---------->在键myhash中存入一个hashmap
(integer) 1

127.0.0.1:6379> hmset myhash username lisi age 21                     ------>在键myhash中存入多个hashmap


OK

127.0.0.1:6379> hget myhash username                                                --------->获取键username的值

"lisi"

127.0.0.1:6379> hmget myhash  username age                                 ---------->获取多个键的值

1) "lisi"

2) "21"

127.0.0.1:6379> hgetall myhash                                                                   --------->得到键myhash中所有的键和值

1) "name"

2) "tom"

3) "age"

4) "21"

5) "addr"

6) "beijing"

7) "username"

8) "lisi"

127.0.0.1:6379> hdel myhash addr age                                               ----------->删除addr和age的键和值

(integer) 2

127.0.0.1:6379> hmset myhash username zhangsan

OK


127.0.0.1:6379> del myhash2                                                                   ----------->删除键myhash2和myhash2中的数据


(integer) 0

127.0.0.1:6379> hget myhash age                                                 

(nil)

127.0.0.1:6379> hset myhash age 2

(integer) 1

127.0.0.1:6379> hincrby myhash age 5                                                 ---------->age+5

(integer) 7

127.0.0.1:6379> hexists myhash username                                           -------->键username在键myhash中是否存在

(integer) 1

127.0.0.1:6379> hexists myhash password                                             ---------->判断怕password是否存在

(integer) 0

127.0.0.1:6379> hlen myhash                                                                          ---------->myhash中键的个数

(integer) 3

127.0.0.1:6379> hkeys myhash                                                                          --------->获取所有键

1) "name"

2) "username"

3) "age"

127.0.0.1:6379> hvals myhash                                                                          --------->获取所有值

1) "tom"

2) "zhangsan"

3) "7"


2.4  存储list

两端添加

127.0.0.1:6379> lpush mylist  a b c
(integer) 3
127.0.0.1:6379> lpush mylist 1 2 3
(integer) 6
127.0.0.1:6379> rpush mylist2 a b c
(integer) 4
127.0.0.1:6379> rpush mylist2 1 2 3 (integer) 7

查看列表

127.0.0.1:6379> lrange mylist 0 5
1) "3"
2) "2"
3) "1"
4) "c"
5) "b"6) "a"

两端弹出


127.0.0.1:6379> lpop mylist
"3"
127.0.0.1:6379> lrange mylist 0 -1
1) "2"
2) "1"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> rpop mylist2
"3"
127.0.0.1:6379> lrange mylist2 0 -1
1) "a"
2) "a"
3) "b"
4) "c"
5) "1"
 
6) "2"

元素个数


127.0.0.1:6379> llen mylist


(integer) 5

lpush仅当key存在时,向list头部插入value,不存在不插入


127.0.0.1:6379> lpushx mylist x
(integer) 6
127.0.0.1:6379> lrange mylist 0 -1
1) "x"
2) "2"
3) "1"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lpushx mylist3 x
 
(integer) 0

初始化

127.0.0.1:6379> lpush mylist 1 2 3
(integer) 9
127.0.0.1:6379> lpush mylist3 1 2 3
(integer) 3
127.0.0.1:6379> lpush mylist3 1 2 3
(integer) 6
127.0.0.1:6379> lpush mylist3 1 2 3
(integer) 9
127.0.0.1:6379> lrange mylist3 0 -1
1) "3"
2) "2"
3) "1"
4) "3"
5) "2"
6) "1"
7) "3"
8) "2"9) "1"

从头删除2 个3

127.0.0.1:6379> lrem mylist3 2 3 

(integer) 2 

127.0.0.1:6379> lrange mylist3 0 -1 

1) "2" 

2) "1" 

3) "2" 

4) "1" 

5) "3" 

6) "2" 

7) "1"

从尾删除2个1

127.0.0.1:6379> lrem mylist3 -2 1 

(integer) 2 

127.0.0.1:6379> lrange mylist3 0 -1 

1) "2" 

2) "1" 

3) "2" 

4) "3" 

5) "2"

删除所有的2

127.0.0.1:6379> lrem mylist3 0 2 

(integer) 3 

127.0.0.1:6379> lrange mylist3 0 -1 

1) "1" 

2) "3"

linsert key before 123 12在123之前插入1

rpoplpush resource destination将链表中的尾部元素弹出并添加到头部

127.0.0.1:6379> lset mylist3 1 123
OK
127.0.0.1:6379> lrange mylist3 0 -1
1) "1"
2) "123"
127.0.0.1:6379> linsert mylist before 123 12
(integer) 10
127.0.0.1:6379> linsert mylist3 before 123 12
(integer) 3
127.0.0.1:6379> lrange mylist3 0 -1
1) "1"
2) "12"
3) "123"
127.0.0.1:6379> linsert mylist2 after 123 3
(integer) -1
127.0.0.1:6379> lrange mylist3 0 -1
1) "1"
2) "12"
3) "123"127.0.0.1:6379> lpush mylist5 1 2 3
(integer) 3
127.0.0.1:6379> lpush mylist6 a b c
(integer) 3
127.0.0.1:6379> rpoplpush mylist5 mylist6
"1"
127.0.0.1:6379> rpoplpush mylist6 mylist6
"a"
127.0.0.1:6379> lrange mylist6 0 -1
1) "a"
2) "1"
3) "c"4) "b"

2.5存储set

set可以看做没有排序的字符集合。set不允许出现重复的元素,多次添加同一元素,只保留一份拷贝

添加/删除元素

127.0.0.1:6379> sadd myset a b c 

(integer) 2 

127.0.0.1:6379> sadd myset a 

(integer) 0 

127.0.0.1:6379> srem myset a b 

(integer) 2

获得集合中元素

127.0.0.1:6379> smembers myset
 1) "7"
 2) "5"
 3) "8"
 4) "6"
 5) "2"
 6) "c"
 7) "1"
 8) "9"
 9) "3"10) "4"

判断参数是否存在

127.0.0.1:6379> sismember  myset a

(integer) 0

集合差集运算

127.0.0.1:6379> sadd mya1 a b c
(integer) 3
127.0.0.1:6379> sadd myb1 a c 1 2
(integer) 4
127.0.0.1:6379> sdiff mya1 myb11) "b"

集合交集运算

127.0.0.1:6379> sadd mya2 a b c
(integer) 3
127.0.0.1:6379> sadd myb2 a c 1 2
(integer) 4
127.0.0.1:6379> sinter mya2 myb2
1) "c"2) "a"

集合并集运算

127.0.0.1:6379> sadd mya3 a b c 

(integer) 3 

127.0.0.1:6379> sadd myb3 a c 1 2 

(integer) 4 

127.0.0.1:6379> sunion mya3 myb3 

1) "b" 

2) "c" 

3) "2" 

4) "a" 

5) "1"

scard key 获取集合中成员数量

127.0.0.1:6379> scard myset

(integer) 10

strandmember key随机获取一个

127.0.0.1:6379> srandmember myset


"4"

sdiff 查看差集,diffstore将差集存入

127.0.0.1:6379> sdiff mya1 myb1 

1) "b" 

127.0.0.1:6379> sdiffstore my1 mya1  myb1 

(integer) 1 

127.0.0.1:6379> smembers my1 

1) "b"

sinter查看交集,sinterstore将交集存入

127.0.0.1:6379> sinter mya1 myb1 

1) "c" 

2) "a" 

127.0.0.1:6379> sinterstore my2 mya1 myb1 

(integer) 2 

127.0.0.1:6379> smembers my2 

1) "c" 

2) "a"

sunionter destination ,将交集存入destination

127.0.0.1:6379> sunion mya1 myb1
1) "b"
2) "c"
3) "2"
4) "a"
5) "1"
127.0.0.1:6379> sunionstore my3 mya1 myb1
(integer) 5
127.0.0.1:6379> smembers my3
1) "b"
2) "c"
3) "2"
4) "a"5) "1"

2.6存储sortedset

Sorted-Set和set类型及其相似,主要差别是sorted-set中的每一个成员都有一个权重,来对其进行排序、

添加元素

127.0.0.1:6379> zadd sort1 70  zhangsan 80 wangwu 90  lisi
(integer) 3
获取权重
127.0.0.1:6379> zscore sort1 zhangsan

"70"

获取元素个数

127.0.0.1:6379> zcard sort1

(integer) 3

移除元素


127.0.0.1:6379> zrem sort1 lisi
(integer) 1
127.0.0.1:6379> zcard sort1
 
(integer) 2

范围查询

127.0.0.1:6379> zrange sort1 0 -1        
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> zrevrange sort1 0 -1  按分数从大到小排序
1) "wangwu"
2) "zhangsan"
127.0.0.1:6379> zremrangebyrank sort1 0 4       按排名范围删除
(integer) 2
127.0.0.1:6379> zremrangebyscore sort1 80 100         按分数范围删除
(integer) 0

zrangebyscore key min max [withscores] [limit offset count]:返回分数在【min,max】的成员并按照分数从低到高排序,

127.0.0.1:6379> zrangebyscore sort1 0 100 withscores
1) "zhou"
2) "70"
3) "wu"4) "80"

zincrby key  increment member :设置指定成员增加的分数

127.0.0.1:6379> zincrby sort1 3 wu

"83"

  zcount key min max 获取分数在【min,max】之间的成员

zrank返回排名(从小到大)

127.0.0.1:6379> zcount sort1 70 80
(integer) 1
127.0.0.1:6379> zrank mysort wu(integer) 2
zrevrank返回排名,(从大到小)
127.0.0.1:6379> zrangebyscore sort1 0 100 withscores 

1) "lisi" 

2) "3" 

3) "zhou" 

4) "70" 

127.0.0.1:6379> zrevrank sort1 zhou 

(integer) 1

对与五种数据类型的基本操作,我们今天暂时交流到这里,明天在接着介绍