Redis——NOSQL、Redis概述、Redis数据类型、通用命令

目录

  • NOSQL概述
  • NOSQL和关系型数据库比较
  • NOSQL的优缺点
    • 非关系型数据库的优势
    • 关系型数据库的优势
  • 主流的NOSQL产品
  • Redis概述
  • Redis的五种数据类型
    • 字符串类型String
    • 哈希类型hash
    • 有序可重复列表类型list
    • 无序不可重复列表类型set
    • 有序结合类型sortset
  • Redis的通用命令

NOSQL概述

跳转到目录

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

NOSQL和关系型数据库比较

跳转到目录
Redis——NOSQL、Redis概述、Redis数据类型、通用命令_第1张图片

NOSQL的优缺点

跳转到目录

  • 优点:

    • 成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
    • 查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
    • 存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
    • 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
  • 缺点:

    • 维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
    • 不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
    • 不提供关系型数据库对事务的处理。

非关系型数据库的优势

跳转到目录

  • 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
  • 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势

跳转到目录

  • 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
  • 事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。

总结

  • 关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补。
  • 一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据

主流的NOSQL产品

跳转到目录
Redis——NOSQL、Redis概述、Redis数据类型、通用命令_第2张图片

  • 键值(Key-Value)存储数据库
    • 相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
    • 典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
    • 数据模型: 一系列键值对
    • 优势: 快速查询
    • 劣势: 存储的数据缺少结构化
  • 列存储数据库
    • 相关产品:Cassandra, HBase, Riak
    • 典型应用:分布式的文件系统
    • 数据模型:以列簇式存储,将同一列数据存在一起
    • 优势:查找速度快,可扩展性强,更容易进行分布式扩展
    • 劣势:功能相对局限
  • 文档型数据库
    • 相关产品:CouchDB、MongoDB
    • 典型应用:Web应用(与Key-Value类似,Value是结构化的)
    • 数据模型: 一系列键值对
    • 优势:数据结构要求不严格
    • 劣势: 查询性能不高,而且缺乏统一的查询语法
  • 图形(Graph)数据库
    • 相关数据库:Neo4J、InfoGrid、Infinite Graph
    • 典型应用:社交网络
    • 数据模型:图结构
    • 优势:利用图结构相关算法。
    • 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。

Reids概述

跳转到目录
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,redis就是在内存中的一个大的Map集合,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis主要支持的键值数据类型如下:key为字符串类型, value为任意类型;

  • 字符串类型 string
    Map
  • 散列类型 hash
    Map>
  • 列表类型 list
    Map>
  • 集合类型 set
    Map>
  • 有序集合类型 sortedset
    Map>
    Redis——NOSQL、Redis概述、Redis数据类型、通用命令_第3张图片

应用场景:

  • 缓存(数据查询、短连接、新闻内容、商品内容等等)
    Redis——NOSQL、Redis概述、Redis数据类型、通用命令_第4张图片
  • 聊天室的在线好友列表
  • 任务队列。(秒杀、抢购、12306等等)
  • 应用排行榜
  • 网站访问统计
  • 数据过期处理(可以精确到毫秒
  • 分布式集群架构中的session分离

Redis的下载和安装

跳转到目录

  • 官网下载: http://redis.io/download
  • github下载: https://github.com/microsoftarchive/redis

window版Redis的目录结构

目录或文件 作用
redis-benchmark 性能测试工具
redis-check-aof AOF文件修复工具
redis-check-dump RDB文件检查工具(快照持久化文件)
redis-cli 命令行客户端
redis-server redis 服务器启动命令
redis.windows.conf redis 核心配置文件

Windows服务

  • 安装windows服务: redis-server.exe --service-install redis.windows.conf --loglevel verbose
  • 卸载windows服务: redis-server --service-uninstall

Redis的五种数据类型

跳转到目录

字符串类型String

跳转到目录
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型存入和获取的数据相同。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

常用命令

  • set key value
    设定key持有指定的字符串value,如果该key存在则进行覆盖操作。总是返回”OK”

    127.0.0.1:6379> set company “sunny”
    OK
    127.0.0.1:6379>

  • get key
    获取key的value。如果与该key关联的value不是String类型,redis将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返回(nil)。

    127.0.0.1:6379> set name “sunny”
    OK
    127.0.0.1:6379> get name
    “sunny”

  • del key
    删除指定key

    127.0.0.1:6379> del name (integer)
    1
    127.0.0.1:6379> get name
    (nil)

    incr命令 自增 
    decr命令 自减 
    incrby key step 自增步数 
    decrby key step 自减步数
    

哈希类型hash

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

常用命令

  • hset key field value
    为指定的key设定field/value对(键值对)。
    注意:给同一个field设置值,后者会覆盖前面的

  • hmset key1 field/value key2 field/value
    同时给多个key设定field/value

  • hget key field
    返回指定的key中的field的值

  • hmget key field1 field2 field3
    返回指定key的多个field的值

  • hdel key field [field … ]
    可以删除一个或多个字段,返回值是被删除的字段个数

  • hgetall key
    可以获取该键的所有数据

127.0.0.1:6379> hset user1 username xiaoming
(integer) 1
127.0.0.1:6379> hset user1 password 123
(integer) 1
127.0.0.1:6379> hset user1 email [email protected]
(integer) 1
127.0.0.1:6379> hmset user1 address beijing telephone 13422221123
OK
127.0.0.1:6379> hget user1 username
"xiaoming"
127.0.0.1:6379> hmget user1 username password address
1) "xiaoming"
2) "123"
3) "beijing"
127.0.0.1:6379> hgetall user1
 1) "username"
 2) "xiaoming"
 3) "password"
 4) "123"
 5) "email"
 6) "[email protected]"
 7) "address"
 8) "beijing"
 9) "telephone"
10) "13422221123"
127.0.0.1:6379> hset user1 password 456
(integer) 0
127.0.0.1:6379> hgetall user1
 1) "username"
 2) "xiaoming"
 3) "password"
 4) "456"
 5) "email"
 6) "[email protected]"
 7) "address"
 8) "beijing"
 9) "telephone"
10) "13422221123"

列表类型list

跳转到目录
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295

常用命令

  • lpush key values[value1 value2…]
    在指定的key所关联的list的头部插入所有的values,如果该key不存在,该命令在插入的之前创建一个与该key
    关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。

  • lpop key
    返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素。

  • rpop key
    从尾部弹出元素

  • lrange key start end :范围获取
    遍历该键的所有数据

127.0.0.1:6379> lpush mylist1 a b c d e
(integer) 5
127.0.0.1:6379> rpush mylist1 x y z 1 2 3
(integer) 11
127.0.0.1:6379> lrange mylist1 0 10
 1) "e"
 2) "d"
 3) "c"
 4) "b"
 5) "a"
 6) "x"
 7) "y"
 8) "z"
 9) "1"
10) "2"
11) "3"
127.0.0.1:6379> rpop mylist1 3
(error) ERR wrong number of arguments for 'rpop' command
127.0.0.1:6379> rpop mylist1
"3"
127.0.0.1:6379> lrange mylist1 0 10
 1) "e"
 2) "d"
 3) "c"
 4) "b"
 5) "a"
 6) "x"
 7) "y"
 8) "z"
 9) "1"
10) "2"

列表类型set

跳转到目录
在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295,和List类型不同的是,Set集合中不允许出现重复的元素

常用命令

  • sadd key values[value1、value2…]
    向set中添加数据,如果该key的值已有则不会重复添加
  • smembers key
    获取set中所有的成员
  • srem key members[member1、member2…]
    删除set中指定的成员
127.0.0.1:6379> sadd myset1 a b c c
(integer) 3
127.0.0.1:6379> smembers myset1
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> srem myset1 b
(integer) 1
127.0.0.1:6379> smembers myset1
1) "a"
2) "c"

有序结合类型sortset

跳转到目录
在redis中,可以保证不重复的元素,仍然可以进行排序。
每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

常用命令

  • zadd key values[value1、value2…]
    向set中添加成员
  • zrange key start end [withscores]
    通过索引区间返回有序集合成指定区间内的成员
  • zrem key value
    移除set中的成员
127.0.0.1:6379> zadd mysort 60 zhangsan 20 lisi 55 wangwu
(integer) 3
127.0.0.1:6379> zrange mysort 0 -1
1) "lisi"
2) "wangwu"
3) "zhangsan"
127.0.0.1:6379> zrevrange mysort 0 -1
1) "zhangsan"
2) "wangwu"
3) "lisi"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "lisi"
2) "20"
3) "wangwu"
4) "55"
5) "zhangsan"
6) "60"

Redis的通用命令

跳转到目录

  • keys pattern(格式)
    获取所有与pattern匹配的key,返回所有与该key匹配的keys。*表示任意一个或多个字符,?表示任意一个字符

  • exists key
    判断该key是否存在,1代表存在,0代表不存在

  • type key
    获取指定key的类型。该命令将以字符串的格式返回。 返回的字符串为string、list、set、hash,如果key不存在返回none

  • expire key time(时间)
    设置key的存活时间

127.0.0.1:6379> keys *
1) "categoryList"
2) "user1"
3) "mylist1"
4) "mysort"
5) "list_325"
6) "myset1"
7) "num"
8) "category_325"
9) "test"
127.0.0.1:6379> exists num
(integer) 1
127.0.0.1:6379> exists num1
(integer) 0
127.0.0.1:6379> set code 543211
OK
127.0.0.1:6379> expire code 3
(integer) 1
127.0.0.1:6379> get code
"543211"
127.0.0.1:6379> get code
(nil)
127.0.0.1:6379> type num
string
127.0.0.1:6379> type mysort
zset
127.0.0.1:6379> keys my????
1) "mysort"
2) "myset1"
127.0.0.1:6379>    

你可能感兴趣的:(Redis)