非关系型数据库 -- redis

一、Redis介绍

  (一)NoSql介绍

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

NoSQL,泛指非关系型的数据库NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。

  (二)Redis

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

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

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

  (三)Redis应用场景

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

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

  聊天室的在线好友列表。

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

  应用排行榜。

  网站访问统计。

  数据过期处理(可以精确到毫秒)

二、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

三、Redis客户端

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

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

  • 如果不指定主机和端口也可以
[root@hadoop bin]# ./redis-cli

四、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"

 

posted @ 2019-05-31 16:49  MoonTwilight  阅读(223)  评论(0编辑  收藏  举报