非关系型数据库 -- 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"
出 处:https://www.cnblogs.com/AardWolf/
特此声明:欢迎园子的大大们指正错误,共同进步。如有问题或建议,也请各位大佬多多赐教!如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。