非关系型数据库 -- redis

1、Redis介绍

  (一)NoSql介绍

  为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSql数据库。前端

NoSQL,泛指非关系型的数据库NoSQL即Not-Only SQL,它能够做为关系型数据库的良好补充。linux

  (二)Redis

  Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它经过提供多种键值数据类型来适应不一样场景下的存储需求,redis

目前为止Redis支持的键值数据类型以下:数据库

字符串类型、散列类型、列表类型、集合类型、有序集合类型json

  (三)Redis应用场景

  缓存(数据查询、短链接、新闻内容、商品内容等等)。(最多使用vim

  分布式集群架构中的session分离。后端

  聊天室的在线好友列表。缓存

  消息队列。(秒杀、抢购、12306等等)服务器

  应用排行榜。session

  网站访问统计。

  数据过时处理(能够精确到毫秒)

2、Redis安装配置

  (一)redis下载

官网地址:http://redis.io/

下载地址:http://download.redis.io/releases/redis-3.2.11.tar.gz

  (二)redis安装

Redis是C语言开发,建议在linux上运行,本教程使用Centos6.5做为安装环境。

第一步:在VMware中安装CentOS

第二步:Linux下安装gcc环境

[root@hadoop ~]#yum install gcc-c++

第四步:解压缩Redis源码包第三步:将下载的Redis源码包上传到Linux服务器中

[root@hadoop ~]# tar -zxvf redis-3.2.11.tar.gz -C /usr/local/src

第五步:编译redis源码

[root@hadoop src]# cd /usr/local/src/redis-3.2.11/
[root@hadoop redis-3.0.7]# make

第六步:安装redis

[root@hadoop redis-3.0.7]# make install PREFIX=/usr/local/redis-3.2.11

  (三)redis启动

前端启动   

  • 启动方式:

直接运行bin/redis-server将之前端模式启动。

[root@hadoop redis-3.0.7]# cd /usr/local/redis-3.0.7/bin
[root@hadoop bin]# ./redis-server
  • 启动缺点:

    ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法

  • 前端启动的关闭:ctrl+c

后端启动

第一步:redis源码包/usr/local/src/redis-3.0.7中的redis.conf配置文件复制到/usr/local/redis-3.0.7/bin/下

[root@hadoop bin]# cd /usr/local/src/redis-3.0.7/
[root@hadoop redis-3.0.7]# cp redis.conf /usr/local/redis-3.0.7/bin

第二步:修改/usr/local/redis-3.0.7/bin 下的redis.conf,daemonize由no改成yes 

[root@hadoop redis-3.0.7]# cd /usr/local/redis-3.0.7/bin
[root@hadoop bin]# vim redis.conf

第三步:执行命令

[root@hadoop bin]# ./redis-server redis.conf

关闭:

[root@hadoop bin]# ./redis-cli shutdown

3、Redis客户端

  • 指定主机和端口
[root@hadoop bin]# ./redis-cli -h 127.0.0.1 -p 6379

  -p:redis实例的端口号  -h:redis服务器的ip地址

  • 若是不指定主机和端口也能够
[root@hadoop bin]# ./redis-cli

4、Redis数据类型

Redis中存储数据是经过key-value存储的,对于value的类型有如下几种:

  • 字符串
  • Hash类型
  • List
  • Set
  • SortedSet(zset)

PS:redis中的命令语句中,命令是忽略大小写的,而key是不忽略大小写的。

  (一)String类型

命令

赋值:SET key value

127.0.0.1:6379> set test 123
OK

取值:GET key

127.0.0.1:6379> get test
"123

设置/获取多个键值: 

MSET key value [key value …]

MGET key [key …]

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> mget k1 k3
1) "v1"
2) "v3"

取值并赋值: GETSET key value

127.0.0.1:6379> getset s2 222
"111"
127.0.0.1:6379> get s2
"222"

删除:DEL key

127.0.0.1:6379>del test
(integer) 1

数值增减 

n 递增数字

当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其做用是让当前键值递增,并返回递增后的值。

语法:INCR key

127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3

n 增长指定的整数: INCRBY key increment

127.0.0.1:6379> incrby num 2
(integer) 5
127.0.0.1:6379> incrby num 2
(integer) 7
127.0.0.1:6379> incrby num 2
(integer) 9

n 递减数值:DECR key

127.0.0.1:6379>decr num
(integer) 9
127.0.0.1:6379>decr num
(integer) 8

n 减小指定的整数DECRBY key decrement

127.0.0.1:6379> decr num
(integer) 6
127.0.0.1:6379> decr num
(integer) 5
127.0.0.1:6379> decrby num 3
(integer) 2
127.0.0.1:6379> decrby num 3
(integer) -1

APPEND的做用是向键值的末尾追加value。若是键不存在则将该键的值设置为value,即至关于SET key value。返回值是追加后字符串的总长度。向尾部追加值

语法:APPEND key value

127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> append str " world!"
(integer) 12
127.0.0.1:6379> get str
"hello world!"

获取字符串长度 

STRLEN命令返回键值的长度,若是键不存在则返回0。

语法:STRLEN key

127.0.0.1:6379> strlen str
(integer) 0
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> strlen str
(integer) 5

应用 

自增主键

商品编号、订单号采用string的递增数字特性生成。201703240000000

Key value

定义商品编号key:items:id   key value

192.168.101.3:7003> INCR items:id
(integer) 2
192.168.101.3:7003> INCR items:id
(integer) 3

  (二)Hash类型

使用string的问题:

假设有User对象以JSON序列化的形式存储到Redis中,User对象有id,username、password、age、name等属性,存储的过程以下:

{
    Id : 1,
    Username: zhangsan
}
set user { Id : 1,username: zhangsan}

保存、更新:

User对象à json(string) à redis

若是在业务上只是更新age属性,其余的属性并不作更新我应该怎么作呢?若是仍然采用上边的方法在传输、处理时会形成资源浪费,下边讲的hash能够很好的解决这个问题。

redis hash介绍

  hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。

命令

赋值

HSET命令不区分插入和更新操做,当执行插入操做时HSET命令返回1,当执行更新操做时返回0。

  • 一次只能设置一个字段值

语法:HSET key field value

127.0.0.1:6379> hset user username zhangsan
(integer) 1

一次能够设置多个字段值 

语法:HMSET key field value [field value ...]

127.0.0.1:6379> hmset user age 20 username lisi
OK

当字段不存在时赋值,相似HSET,区别在于若是字段存在,该命令不执行任何操做 

语法:HSETNX key field value

--若是user中没有age字段则设置age值为30,不然不作任何操做
127.0.0.1:6379> hsetnx user age 30 
(integer) 0

取值 

  • 一次只能获取一个字段值

语法:HGET key field

127.0.0.1:6379> hget user username
"zhangsan“

一次能够获取多个字段值 

语法:HMGET key field [field ...]

127.0.0.1:6379> hmget user age username
1) "20"
2) "lisi"

获取全部字段值 

语法:HGETALL key

127.0.0.1:6379> hgetall user
1) "age"
2) "20"
3) "username"
4) "lisi"

删除字段,能够删除一个或多个字段,返回值是被删除的字段个数

语法:HDEL key field [field ...]

127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hdel user age name
(integer) 0
127.0.0.1:6379> hdel user age username
(integer) 1

增长数字HINCRBY key field increment

127.0.0.1:6379> hincrby user age 2 //将用户的年龄加2
(integer) 22
127.0.0.1:6379> hget user age //获取用户的年龄
"22

判断字段是否存在HEXISTS key field

127.0.0.1:6379> hexists user age //查看user中是否有age字段
(integer) 1
127.0.0.1:6379> hexists user name //查看user中是否有name字段
(integer) 0

只获取字段名或字段值 

HKEYS key

HVALS key

127.0.0.1:6379> hmset user age 20 name lisi
OK
127.0.0.1:6379> hkeys user
1) "age"
2) "name"
127.0.0.1:6379> hvals user
1) "20"
2) "lisi"

语法:HLEN key获取属性数量

127.0.0.1:6379> hlen user
(integer) 2

应用

存储商品信息

  • 商品字段

【商品id、商品名称、商品描述、商品库存、商品好评数量】

  • 定义商品信息的key

商品1001的信息在Redis中的key为:[items:1001]

  • 存储商品信息
192.168.101.3:7003> HMSET items:1001 id 3 name apple price 999.9
OK

获取商品信息 

192.168.101.3:7003> HGET items:1001 id
"3"
192.168.101.3:7003> HGETALL items:1001
1) "id"
2) "3"
3) "name"
4) "apple"
5) "price"
6) "999.9"
相关文章
相关标签/搜索