NOSQL

  1. 介绍:NoSQL(Not Only Sql),是一项全新的数据库理念,泛指非关系型数据库
  2. 优势:NoSQL数据库的产生,就是为了解决,高并发高负载高可用
    • 高并发,在同一个时间内应用服务器会收到大量的请求,同样这些请求也要去操作我们的数据库服务器,每次读写操作就 要发生磁盘的IO,对于关系型数据库而言,已经无法无法承受了
    • 高负载,因为有大量的用户访问门户网站,每个用户访问的以及点击都会产生各种数据,对于数据库而言需要保存大量的数据,那么在关系型数据库中在一张有几亿条记录的表中进 行sql查询,效率是及其低的
    • 高可用,随着与日俱增的访问量和用户量,当数据库已经达到上线的时候,就需要进行相应的扩展,对于关系型数据库而言,在进行数据的扩展和迁移的时候,往往需要停机维护
  3. 特点:易扩展,高性能, 高可用,灵活性数据模型

    redis

    介绍

  4. 介绍:Redis是用c语言开发的一个开源的键值对数据库,对于redis而言键的类型一般都为字符串,对应的值有5中类型

    • 字符串类型(String)
    • 散列类型(hash)
    • 列表类型(list)
    • 集合类型(set)
    • 有序集合类型(sorted set)
  5. 使用场景

    • 缓存(数据查询,新闻,商品信息)(使用最多)
    • 任务队列(秒杀,抢购)
    • 分布式集群的 session 的分离

      下载与安装

  6. 创建目录:redis /usr/local/redis

  7. 下载redis安装包:wgethttp://download.redis.io/releases/redis-5.0.3.tar.gz
  8. 解压:tar -zxvf redis-5.0.3.tar.gz
  9. 进入安装目录,对redis进行编译:make
  10. 进入src目录中,进行安装:make install
  11. 为了方便管理,给常用的几个模块创建快捷连接

    1. 创建bin目录:mkdir /usr/local/redis/redis-5.0.3/bin
    2. 把src目录下的三个文件redis-server、redis-cli、redis-benchmark·,还有一个文件在安装目录下redis.conf文件,拷贝进入bin

      启动与关闭

  12. 前端启动(直接启动):./redis-server

    1. 端口号为6379
    2. 页面不能关闭
  13. 后端启动(配置启动):
    1. 修改配置文件 redis.conf
      • 69行 注释该行 #bind127.0.0.1
      • 88行 yes改为no
      • 136行 no改为yes
    2. 启动redis:./redis-server redis.conf
    3. 查看进程:ps -ef |grep redis 是否启动成功
    4. 使用./redis-cli验证是否连接成功,出现ip后
    5. 测试连接:输入ping确认后,会跳出pong
    6. 关闭redis服务
      1. 第一种
        • ps -ef |grep redis 查看pid值
        • kill -9 pid
      2. 第二种
        • ./redis-cli shutdown

使用redis

  1. 解决中文乱码问题,使用./redis-cli --raw 的方式来启动redis
  2. 一共默认有 16 个库,选择库的命令是 select 0-15 ,默认是 0 号库

    string类型

    字符串类型是Redis中最为基础的数据存储类型,它在 Redis中是二进制安全的,这 便意味着该类型可以接受任 何格式的数据,如JPEG图像数据或Json对象描述信息 等。 在Redis中字符串类型的Value最多可以容纳的数据 长度是512M

  • 设置键值对 set key value
  • 设置多个键值对 mset key1 value1 age 125
  • 通过指定键获取值 get key
    • 如果key不存在返回的值为 nil
  • 删除key del key
  • 先获取该key的值,然后在设置该key的值. getset key value
  • incr key 增加键对应的值让值+1,如果键不存在自动创建一个,默认是0,并加1
  • decr key 减少键对应的值让值­1
  • incrby key increment 相当于 i+=increment
  • decrby key decrement 相当于 i-=decrement
  • append key value 如果该key存在,则在原有的value后追加该值;key不存在,则重新创建一个key/value

    hash类型

    Redis中的Hashes类型可以看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如果 Hash中 包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。

  • 赋值

    • hset key field1 value1 为指定的key设定field/value对(键值对)设置一个
    • hmset key field1 value1 field2 value2 :为指定的key设定field/value对(键值对)设置多个
  • 取值
    • hget key field :返回指定的key中的field的值
    • hmget key field1 field2 field3 :返回指定的key中的field的值,返回多个
    • hgetall key :获取key中的所有filed­vaule
  • 删除
    • hdel key filed1 filed2 ,删除多个
    • del key 删除整个key对应的内容
  • 增加
    • hincrby key field increment 设置key中filed的值增加increment
  • hexists key field 判断指定的key中的filed是否存在
  • hlen key 获取key所包含的field的数量
  • hkeys key 获得所有的filed
  • hvals key 获得所有的value

    list类型

    在Redis中,List类型是按照插入顺序排序的字符串链表。 和数据结构中的普通链表 一样,我们可以在其头部(left)和 尾部(right)添加新的元素。在插入时,如果该键并不 存 在,Redis将为该键创建一个新的链表。与此相反,如果 链表中所有的元素均被移 除,那么该键也将会被从数据库 中删除。List中可以包含的最大元素数量是 4294967295. 从元素插入和删除的效率视角来看,如果我们是在链表的 两头插入或删除元素,这将会是非常高效的操作,即使链 表中已经存储了百万条记录,该操作也可以在常量时间内 完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的

  • 两端添加

    • lpush key value1 value2…
      • 在指定的key所关联的list的头部插入所有的 values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
    • rpush key value1、value2… 在该list的尾部添加元素
    • lpushx key value
      • 仅当参数中指定的key存在时(如果与key管理的list中没有值时,则该key是不存在的)在指定的key所关联的list的头部插入value。
    • rpushx key value 在该list的尾部添加元素
  • 查看列表
    • lrange key start end
    • 获取链表中从start到end的元素的值,start、end可为负数,若为­1则表示链表尾部的元素,­2则表示倒数第二个,依次类推…
  • 两端弹出
    • lpop key 返回并弹出指定的key关联的链表中的第一个元素,即头部元素。
    • rpop key 从尾部弹出元素
  • llen key 返回指定的key关联的链表中的元素的数量。
  • linsert key before|after pivot value 在pivot元素前或者后插入value这个元素。如 linsert mylist before 2 zhangsan

    set类型

    在Redis中,我们可以将Set类型看作为没有排序且不可重复的字符集合,Set可包含的最大元 素数是4294967295. Set类 型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和 differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销

  • sadd key value1、value2… 向set中添加数据,如果该key的值已有则不会 重复添加

  • smembers key 获取set中所有的成员
  • srem key member1、member2… 删除set中指定的成员
  • sismember key member 判断参数中指定的成员是否在该set中
    • 1表示存 在,0表示不存在或者该key本身就不存在
  • scard key 获取set中成员的数量
  • srandmember key 随机返回set中的一个成员
  • 集合相关

    • sdiff key1 key2 返回key1与key2中相差的成员,而且与key的顺序有关。即返回差集。
      • 如 sdiff key1 key2 表示key1中哪些元素不在key2中
    • sdiffstore destination key1 key2 将key1、key2相差的成员存储在destination上
    • sinter key1 key2 返回交集。
    • sinterstore destination key1 key2 将返回的交集存储在destination上
    • sunion key1、key2 返回并集。
    • sunionstore destination key1 key2 将返回的并集存储在destination上

      sortedset类型

      Sorted­Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted­Sets中的每一个成员都会有一个分数 (score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管 Sorted­Sets中的成员必须是唯一的,但是分数(score) 却是可以重复的。在Sorted­Set中添加、删除或更新一个成 员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted­Sets中的成员在集合中的位置是有序的,因此即便是访问位于集合中部的成员也仍然是非常高效的。

  • zadd key score1 member1 score2 member2 … 将所有成员以及该成员的分数存放到sorted­set中

  • zscore key member 返回指定成员的分数
  • zcard key 获取集合中的成员数量
  • zrem key member[member…] 移除集合中指定的成员,可以指定多个成员。
  • zrange key start end [withscores] 获取集合中脚标为start­end的成员,[withscores]参数表明返回的成员包含其分数。
  • zrevrange key start end [withscores] 按照分数从大到小的顺序返回索引从start­end的元素,[withscores]参数表明返回的成员包含其分数。
  • 删除元素
    • zremrangebyrank key start end 按照排名顺序删除从后向前的元素
    • zremrangebyscore key min max 按照分数从小到达删除
  • zrangebyscore key min max [withscores] [limit offset count]
    • 返回分数在[min,max]的成员并按照分数从低到高排序。
    • [withscores]:显示分数;
    • [limit offset count]:offset,表明从脚标为offset的元素开始并返回 count个
    • 例如 zrangebyscore mysort 60 100 withscores limit 0 2
  • zcount key min max 获取分数在[min,max]之间的成员个数
  • zincrby key increment member 设置指定成员的增加的分数
  • zrank key member 返回成员在集合中排名,从小到大排序,索引从0开始

    Jedis

  1. 使用java连接redis
  2. 开发步骤
    1. 添加maven依赖:redis.clients - jedis - 3.0.1
    2. 测试是否连接成功
      1. Jedis jedis = new Jedis("IP地址",6379);
      2. System.out.println(jedis.ping());//打印出pong就说明连接成功