为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSql数据库。前端
NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它能够做为关系型数据库的良好补充。linux
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它经过提供多种键值数据类型来适应不一样场景下的存储需求,redis
目前为止Redis支持的键值数据类型以下:数据库
字符串类型、散列类型、列表类型、集合类型、有序集合类型。json
缓存(数据查询、短链接、新闻内容、商品内容等等)。(最多使用)vim
分布式集群架构中的session分离。后端
聊天室的在线好友列表。缓存
消息队列。(秒杀、抢购、12306等等)服务器
应用排行榜。session
网站访问统计。
数据过时处理(能够精确到毫秒)
官网地址:http://redis.io/
下载地址:http://download.redis.io/releases/redis-3.2.11.tar.gz
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
直接运行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程序结束,不推荐使用此方法
第一步:将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
Redis中存储数据是经过key-value存储的,对于value的类型有如下几种:
PS:在redis中的命令语句中,命令是忽略大小写的,而key是不忽略大小写的。
赋值: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"
127.0.0.1:6379>del test (integer) 1
当存储的字符串是整数时,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
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
127.0.0.1:6379>decr num (integer) 9 127.0.0.1:6379>decr num (integer) 8
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 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
假设有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能够很好的解决这个问题。
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"
127.0.0.1:6379> hlen user (integer) 2
【商品id、商品名称、商品描述、商品库存、商品好评数量】
商品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"