redis01
nosql
not only sql:解决海量数据和大型集群产生的高并发,高可用,高性能问题数据库解决方案,
非关系型数据库,不能替代关系型数据库,作为关系型数据库的一个良好补充(补充关系型数据库性能的瓶颈)
数据分类
结构化数据
数据的结构一样,使用同一的规范(格式)进行处理和维护(存储和管理)(RDBMS)
半结构化数据
介于二者之间的数据如xml
非结构化数据
无法通过统一格式进行存储管理,如文本,音频,视频等(nosql)
nosql的分类
键值存储数据库
产品: Redis,Voldemont,BERKEKEY DB’
典型应用:内容缓存,主要用于处理大量数据的高访问负债
数据模型: 一系列键值对
json:{“key”:”value”, “key2”:”value2”}
优势:快速查询
劣势: 存储的数据缺少结构化
和memcache:的区别
memcache: 数据类型少,做缓存
redis:缓存数据,可以持久化,支持事务;数据类型多
列存储数据库
相关产品:Cassandra,HBase,Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型:一系列键值对
优势:数据结构要求不严格
愣势:查询性能不高,而且缺乏统一的查询语法
图形(Graph)数据库
相关数据库:Neo4j、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
Redis
是使用c语言开发的一个高性能键值数据库。Redis 可以通过一些键值类型来存储数据。也可以实现持久化支持事务操作
常用键值类型:
String 字符类型
map 散列类型
list 列表类型
set 集合类型
sortedset 有序集合类型(zset)
redis的应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
分布式集群架构中的 session分离。
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
redis的安装
安装:
准备gcc环境 yum -y install gcc-c++
make命令: yum -y install make
上传
解压:
tar -zxvf redis-4.0.10.tar.gz -C /opt/
进入:
cd /opt/redis-4.0.10/
编译:
make
/make distclean
(清理之前的编译)….>>/dev/null (黑洞) ,删掉的意思
make test():测试(安装tcl)
安装 make install(默认安装
/usr/local/bin
)手动修改安装路径:
make install PREFIX=/usr/local/redis
cd /usr/local/redis/bin
存放可执行的文件赋值配置文件到etc目录下:
cp /opt/redis-4.0.10/redis.conf /etc/
环境变量
> `export REDIS_HOME=/usr/local/redis
export PATH=$PATH:$JAVA_HOME/bin:$REDIS_HOME/bin;`
redis启动(服务器端+客户端)
前端启动
不推荐,(占用一个窗口),
在目录下
cd /usr/local/redis/bin
- 启动服务端:
redis-server
- port:6379
- 关闭:
- 强制关闭:ctrl +C
- 客户端发送:./redis-cli发送
shutdown
(推荐)
- 启动客户端 redis-cli
- 发送ping 响应PONG
后端启动
修改配置文件
vim /etc/redis.conf
修改绑定的ip(69行)
bind 192.168.2.101
修改为台守护进程运行(136行)
daemonize yes
databases 16: 分了16数据库
下标默认(0-15)
启动
redis-server /etc/redis.conf
查看
ps -aux|grep redis
netstat -nltp
关闭服务端
- kill -9 6379
- redis-cli shutdown(推荐)
自带客户端连接
redis-cli -h ip地址 -p 端口
redis-cli -h 192.168.2.101 -p 6379
图形客户端
需要注意防火墙
jedis客户端
Redis 数据类型
字符串String
命令
赋值和取值
set key value
setget key value: 取值并赋值
删除
del key
数值增减
incr key :增量1
incrby key n: 增量n
decr: key :减少1
decrby key n: 减少n
其他命令
- append key value : 追加值
- stlen key :获取值得长度
应用:自增主键
商品编号,订单号采用string的递增数值特性生成
1 | 定义商品: key items:id |
hash类型
散列类型:支持扩展key,提供字段属性,字段,字段值之间的映射
字段值只支持字符串
键 字段名 字段值
赋值
- hset:一次只能设置一个字段
- hmset :一次可以设置多个字段值
- hsetnx:有该key则不赋值,没有则赋值相当于hset
hset不区分插入和更新,0代表更新,1代表插入
1 | 192.168.2.101:6379> hset user:001 name zs |
取值
- hget: 一次只能取一个字段值
- HMGET key field [field …] : 一次可以获取多个字段值
- hgetall key:
1 | 192.168.2.101:6379> hget user:001 name |
删除字段
- hdel :删除字段
1 | 192.168.2.101:6379> hedl user:001 sex |
增加数字
- hincrby
1 | 192.168.2.101:6379> hset user:001 age 15 |
其他命令
判断字段是否存在
haexists key 字段名 :1存在 ,0不存在
1 | 192.168.2.101:6379> HEXISTS user:001 sex |
获取字段名或字段值
语法:
hkeys key
hvals key
1 | 192.168.2.101:6379> hkeys user:sun |
获取字段的数量
hlen key
1
2192.168.2.101:6379> HLEN user:001
(integer) 2
应用
存储商品信息
商品字段
【商品id、商品名称、商品描述、商品库存、商品好评】
定义商品信息的key
商品1001的信息在 Redis中的key为:[items:1001]
存储商品信息
1
2192.168.101.3:7003> HMSET items:1001 id 3 name apple price 999.9
OK获取商品信息
1
2
3
4
5
6
7
8
9192.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"
1 |
|
192.168.2.101:6379> lpush list1 a b c
(integer) 3
192.168.2.101:6379> rpush list1 d e f
(integer) 6
192.168.2.101:6379> LRANGE list1 0 -1
- “c”
- “b”
- “a”
- “d”
- “e”
- “f”
1 |
|
192.168.2.101:6379> LPOP list1
“c”
192.168.2.101:6379> rpop list1
“f”
1 |
|
192.168.2.101:6379> lrange list1 0 2
“b”
“a”
“d”
192.168.2.101:6379>192.168.2.101:6379> lrange list1 0 -1
“b”
“a”
“d”
“e”
1 |
|
127.0.0.1:6379> llen list:1
(integer) 2
1 |
|
192.168.2.101:6379> LRANGE list1 0 -1
“e”
“d”
“b”
“b”
“a”
“e”
“d”
“b”
“b”
“a”
“b”
“a”
“d”
“e”
192.168.2.101:6379> LREM list1 3 a
(integer) 3192.168.2.101:6379> LRANGE list1 0 -1
“e”
“d”
“b”
“b”
“e”
“d”
“b”
“b”
“b”
“d”
“e”
192.168.2.101:6379> LREM list1 0 b
(integer) 5
192.168.2.101:6379> LRANGE list1 0 -1
- “e”
- “d”
- “e”
- “d”
- “d”
- “e”
192.168.2.101:6379> LREM list1 -2 d
(integer) 2
192.168.2.101:6379> LRANGE list1 0 -1
- “e”
- “d”
- “e”
- “e”
192.168.2.101:6379>
1 |
|
192.168.2.101:6379> LRANGE list1 0 -1
- “e”
- “d”
- “e”
- “e”
192.168.2.101:6379> LINDEX list1 0
“e”
192.168.2.101:6379> LINDEX list1 -3
“d”
1 |
|
127.0.0.1:6379> lrange l:list 0 -1
- “6”
- “5”
- “0”
- “2”
127.0.0.1:6379> ltrim l:list 0 2
OK
127.0.0.1:6379> lrange l:list 0 -1 - “6”
- “5”
- “0”
1 |
|
127.0.0.1:6379> lrange list 0 -1
“3”
“2”
“1”
127.0.0.1:6379> linsert list after 3 4
(integer) 4127.0.0.1:6379> lrange list 0 -1
“3”
“4”
“2”
“1”
1 |
|
127.0.0.1:6379> rpoplpush list newlist
“1”
127.0.0.1:6379> lrange newlist 0 -1
- “1”
127.0.0.1:6379> lrange list 0 -1 - “3”
- “4”
- “2”
1 |
|
商品评论列表
思路:
在Redis中创建商品评论列表
用户发布商品评论,将评论信息转成json存储到list中。
用户在页面查询评论列表,从redis中取出json数据展示到页面。
定义商品评论列表key:
商品编号为1001的商品评论key【items: comment:1001】
192.168.101.3:7001> LPUSH items:comment:1001 ‘{“id”:1,”name”:”商品不错,很好!!”,”date”:1430295077289}’
1 |
|
192.168.2.101:6379> sadd set1 a b c d
(integer) 4
192.168.2.101:6379> SREM set1 a
(integer) 1
192.168.2.101:6379> SMEMBERS set1
“c”
“b”
“d”
192.168.2.101:6379> SISMEMBER set1 c
(integer) 1
1 |
|
192.168.2.101:6379> ZADD zset1 80 zs 90 ls 100 ww
(integer) 3
192.168.2.101:6379> ZADD zset1 85 zs
(integer) 0
192.168.2.101:6379> ZADD zset1 75 zl
(integer) 1
1 |
|
192.168.2.101:6379> zrem zset1 zs
(integer) 1
1 |
|
192.168.2.101:6379> ZSCORE zset1 zs
“85”
1 |
|
192.168.2.101:6379> ZRANGE zset1 0 -1
“zl”
“ls”
“ww”
192.168.2.101:6379> ZRANGE zset1 0 -1 withscores
“zl”
“75”
“ls”
“90”
“ww”
“100”
1 |
|
192.168.2.101:6379> ZREVRANGE zset1 0 -1
- “ww”
- “ls”
- “zl”
192.168.2.101:6379> ZREVRANGE zset1 0 -1 withscores - “ww”
- “100”
- “ls”
- “90”
- “zl”
- “75”
1 |
|
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 90 97 WITHSCORES
- “wangwu”
- “94”
- “lisi”
- “97”
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 70 100 limit 1 2 - “wangwu”
- “lisi”
1 |
|
127.0.0.1:6379> ZINCRBY scoreboard 4 lisi
“101“
1 |
|
127.0.0.1:6379> ZCARD scoreboard
(integer) 3
1 |
|
127.0.0.1:6379> ZCOUNT scoreboard 80 90
(integer) 1
1 |
|
127.0.0.1:6379> ZREMRANGEBYRANK scoreboard 0 1
(integer) 2
127.0.0.1:6379> ZRANGE scoreboard 0 -1
- “lisi”
1 |
|
127.0.0.1:6379> zadd scoreboard 84 zhangsan
(integer) 1
127.0.0.1:6379> ZREMRANGEBYSCORE scoreboard 80 100
(integer) 1
1 |
|
需求:根据商品销售量对商品进行排行显示
思路:定义商品销售排行榜(sorted set集合),Key为items:sellsort,分数为商品销售量。
写入商品销售量:
商品编号1001的销量是9,商品编号1002的销量是10
192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002
商品编号1001的销量加1
192.168.101.3:7001> ZINCRBY items:sellsort 1 1001
商品销量前10名:
192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores
1 | ### |
返回满足给定pattern 的所有key
redis 127.0.0.1:6379> keys mylist*
- “mylist”
- “mylist5”
- “mylist6”
- “mylist7”
- “mylist8”
1 |
|
redis 127.0.0.1:6379> exists HongWan
(integer) 0
redis 127.0.0.1:6379> exists age
(integer) 1
redis 127.0.0.1:6379>
从结果来看,数据库中不存在HongWan 这个key,但是age 这个key 是存在的
1 |
|
redis 127.0.0.1:6379> del age
(integer) 1
redis 127.0.0.1:6379> exists age
(integer) 0
1 |
|
age 成功的被我们改名为age_new
redis 127.0.0.1:6379[1]> keys *
- “age”
redis 127.0.0.1:6379[1]> rename age age_new
OK
redis 127.0.0.1:6379[1]> keys * - “age_new”
redis 127.0.0.1:6379[1]>
1 |
|
redis 127.0.0.1:6379> type addr
string
redis 127.0.0.1:6379> type myzset2
zset
redis 127.0.0.1:6379> type mylist
list
redis 127.0.0.1:6379>
1 |
|
EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除
TTL key 查看key生于的生存时间
PERSIST key 清除生存时间
PEXPIRE key milliseconds 生存时间设置单位为:毫秒
1 |
192.168.101.3:7002> set test 1 设置test的值为1
OK
192.168.101.3:7002> get test 获取test的值
“1”
192.168.101.3:7002> EXPIRE test 5 设置test的生存时间为5秒
(integer) 1
192.168.101.3:7002> TTL test 查看test的生于生成时间还有1秒删除
(integer) 1
192.168.101.3:7002> TTL test
(integer) -2
192.168.101.3:7002> get test 获取test的值,已经删除
(nil)
1 |