一:redis数据库简介
Redis 是开源免费的,遵守BSD协议,是一个高性能的key-value非关系型数据库。
数据库的特点
1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2.Redis不仅仅支持简单的key-value类型的数据,同时还提供String,list,set,zset,hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。
4.性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
5.原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
6.丰富的特性 – Redis还支持 publish/subscribe, 通知, 设置key有效期等等特性。
redis支持的语言
ActionScript Bash C C# C++ Clojure Common Lisp
Crystal D Dart Elixir emacs lisp Erlang
Fancy gawk GNU Prolog Go Haskell Haxe Io Java Javascript
Julia Lua Matlab mruby Nim Node. js objective-C
OCaml Pascal Perl PHP Pure Data Python R Racket
Rebol Ruby Rust Scala Scheme Smalltalk Swift Tcl VB VCL
redis的应用场景
1,会话缓存(最常用)
2,消息队列,比如支付
3,活动排行榜或计数
4,发布,订阅消息(消息通知)
5,商品列表,评论列表等
redis数据库类型
Redis一共支持五种数据类:string(字符串),hash(哈希),list(列表),set(集合)和zset(sorted set有序集合)。
二:关系型数据库与非关系型数据库
关系型数据库
●一个结构化的数据库,创建在关系模型基础上
般面向于记录
●包括
Oracle、 MySQL、 SQL Server Microsoft Access、dB2等
非关系型数据库
●除了主流的关系型数据库外的数据库,都认为是非关系型
●包括
◆ Redis、 MongBD、 Hbase、 CouhDB等
非关系型数据库产生的背景
High performance—对数据库高并发读写需求
Huge Storage——对海量数据高效存储与访问需求
High Scalability&& High Availability——对数据库高
可扩展性与高可用性需求
三:redis安装部署
操作步骤
1.解压软件包
2.make && make install
3.设置redis相关配置文件
编译安装redis
[root@localhost src]# tar xvzf redis-4.0.9.tar.gz
[root @localhost src]# cd redis-4.0.9/
[root@localhost redis-4.0.9]# make
[root@localhost redis-4.0.9]# make PREFIX=/usr/local/redis install
[root @localhost ~] ln -s /usr/local/redis/bin/* /usr/local/bin/
设置redis相关配置文件
[root @localhost redis]# cd /usr/local/src/redis-4.0.9/utils/
[root@localhost utils]./install_ server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default-/etc/redis/6379. conf
Please select the redis log file name[var/log/redis_6379.log]
Selected default-/var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default-/var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server
redis进程控制
[root@localhost utils]# /etc/init.d/redis_6379 status
Redis is running(5436)
[root@localhost utils]# /etc/init.d/redis_6379 stop
Stopping...
Redis stopped
[root @localhost utils]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@localhost utils]# /etc/init.d/redis_6379 restart
Stopping...
Redis stopped
Starting Redis server...
Redis配置文件
配置参数(/etc/redis/6379.conf)
●bind:监听的主机地址
●port:端口
● daemonize yes:启用守护进程
● pidfile:指定PID文件
● loglevel notice:日志级别
● logfile:指定日志文件
四:redis数据库常用命令
redis-cli命令行工具
连接本地数据库
[root@localhost utils]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379>
连接远程数据库
[root@localhost utils] redis-cli -h 192.168.10.161-p6379
192.168.10.161:6379>
获取命令帮助
help @:获取中的命令列表
help :获取某个命令的帮助
help :获取可能帮助的主题列表
set和get
set:存放数据
get:获取数据
[root@localhost~]#/usr/local/redis/bin/redis-cli
127.0.0.1: 6379> set teacher zhanglong
OK
127.0.0.1:6379> get teacher
"zhanglong"
key相关命令
●keys:获取符合规则的键值列表
●exists:判断键值是否存在
●del:删除当前数据库的指定key
●type:获取key对应 value的值类型
rename(覆盖)/ renamenx(不覆盖):对已有的key进行
重命名
●dbsize:查看当前数据库中key的数目
redis-benchmark测试工具
●-h:指定服务器主机名
●-p:指定服务器端口
●-C:指定并发连接数
●-n:指定请求数
●-d:以字节的形式指定SET/GET值的数据大小
●-q:强制退出Redis,仅显示query/sec值
●向P地址为192.168.10.161、端口为6379 Redis的服务器
发送100个并发连接与100000个请求测试性能
[root@localhost~]# /usr/local/redis/bin/redis-benchmark -h 192.168.10.161 -p 6379 -c 100 -n 100000
●测试存取大小为100字节的数据包的性能
[root@localhost~]#/usr/local/redis/bin/redis-benchmark -h 192.168.10.161 -p 6379 -q -d 100
redis多数据库操作
■ Redis支持多数据库,默认支持16个数据库,0-15命名
■多数据库相互独立,互不干扰
■多数据库常用命令
●多数据库间切换
●多数据库间移动数据
●清除数据库内数据
注意:非关系型数据库按应用存放,关系型数据库按场景存放
五:实验案列
Redis数据类型
Redis支持五种数据类型: string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
String(字符串)
string是redis最基本的类型,你可以理解成与 Memcached一模一样的类型,一个key对应一个 value
string类型是二进制安全的。 redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
string类型是Redis最基本的数据类型, string类型的值最大能存储512mb
示例:
192.168.195.180: 6379> set name zhangsan
OK
192.168.195.180:6379>get name
“zhangsan”
Hash(哈希字典)
Redis hash是一个键值(key=> value)对集合。
Redis hash是一个 string类型的 field和 value的映射表,hash特别适合用于存储对象。
每个hash可以存储2的32次方-1键值对。
作用场景:
键值对集合即编程语言中的Map类型
适合存储对象并且可以像数据库中 update一个属性一样只修改某一项属性值
示例:
192.168.195.180:6379> hmset stu name lisi age 18 sex 男
OK
192.168.195.180:6379> hget stu name
“lisi”
192.168.195.180:6379> hget stu age
18
192.168.195.180:6379> hget stu sex
“\xe7\x94\xb7” (此处性别显示的是乱码,想要显示成中文,只需要在命令结尾加上’ - - raw '即可)
[rootlocalhost utils]# redis-cli -h 192.168.195.18 -p 6379 --raw
192.168.195.180:6379> hget stu sex
男
List(列表)
Redis列表是简单的字符串列表,按照插入顺序排序,可以重复。可以添加一个元素到列表的头部(左边)或者尾部(右边)
列表最多可存储2的32次方-1元素。
作用场景
增删快提供了操作某一段元素的API
1最新消息排行等功能(比如朋友圈的时间线)2消息队列
192.168.195.180:6379> lpush hobby play
1
192.168.195.180:6379> lpush hobby read
2
192.168.195.180: 6379> lpush hobby sport
3
192.168.195.180:6379> lrange hobby 0 10
sport
read
play
Set(集合)
Redis的Set是string类型的无序集合
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
作用场景:
1、共同好友 2、利用唯一性统计访问网站的所有独立ip 3、好友推荐时根据tag求交集,大于某个阈值就可以推荐
sadd命令
添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0
示例:
192.168.195.180:6379> sadd color red green yellow
3
192.168.195.180:6379> smembers color
red
yellow
green
192.168.195.180:6379> sadd color red
0
(set集合不能有重复数据,当输入重复数据时会返回0值,表示无法储存)
Zset(sorted set:有序集合)
Redis zset和set一样也 string是类型元素的集合且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。 redis正是通过分数来为集合中的成员进行从小到大的排序
zset的成员是唯一的,但分数(score)却可以重复。
作用场景:
将Set中的元素增加一个权重参数score,元素按score有序排列
数据插入集合时,已经进行天然排序
1、排行榜 2、带权重的消息队列
zadd命令
添加元素到集合,元素在集合中存在则更新对应score
示例:
192.168.195.180:6379> zadd color 0 red
1
192.168.195.180:6379> zadd color 0 blue
1
192.168.195.180:6379> zadd color 1 green
1
192.168.195.180:6379> zadd color 1 yellow
1
192.168.195.180:6379> zrangebyscore color 0 10
blue
red
green
yellow
192.168.195.180:6379> zrangebyscore color 0 0
blue
red
192.168.195.180:6379> zrangebyscore color 1 1
green
yellow
多数据库概念
Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。
Redis是一个字典结构的存储服务器,而实际上一个 Redis实例提供了多个用来存储数据的字典,
客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,
所以可以将其中的每个字典都理解成一个独立的数据库。
每个数据库对外都是一个从0开始的递增数字命名, Redis默认支持16个数据库(可以通过配置文件支持更多,无上限)
可以通过配置databases来修改这一数字。客户端与 Redis建立连接后会自动选择0号数据库,
不过可以随时使用 SELECT命令更换数据库,如要选择1号数据库:
示例:
192.168.195.180:6379> select1
OK
192.168.195.180:6379[1]> set name zhangsan
OK
192.168.195.180:6379[1]> select2
OK
192.168.195.180:6379[2]> set name zhangsan
OK
清空所有数据库数据
192.168.195.180:6379[2]> FLUSHALL
OK
192.168.195.180:6379[2]> get name
注意:
Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。
另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,
要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,
比如 FLUSHALLRedis命令可以清空一个实例中所有数据库中的数据。
综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。
作用场景:
可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,
但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的 Redis实例存储数据。
由于Redis非常轻量级,一个空Redis实例占用的内存只有1M左右,所以不用担心多个redis实例会额外占用很多内存。
Key常规管理
验证key是否存在 exists
192.168.195.180:6379> set name zhangsan
OK
192.168.195.180:6379> exists name
1
192.168.195.180:6379> exists names
0
重命名 rename
192.168.195.180:6379> rename name na
OK
192.168.195.180:6379> get na
zhangsan
设置超时时间 PEXPIRE(单位:毫秒)
192.168.195.180:6379> PEXPIRE na 3000
1
192.168.195.180:6379> get na
查看剩余时间 PTTL(单位:毫秒)
192.168.195.180:6379> PEXPIRE name 30000
1
192.168.195.180:6379> PTTL name
22582
取消超时时间 PEXPIRE
192.168.195.180:6379> set name zhangsan
OK
192.168.195.180:6379> PEXPIRE name 50000
1
192.168.195.180:6379> PTTL name
44606
192.168.195.180:6379> PERSIST name
1
192.168.195.180:6379> PTTL name
-1
192.168.195.180:6379> get name
zhangsan
(设置超时时间,释放内存,是一种数据库的优化)
查看类型 TYPE
192.168.195.180:6379> lpush color red blue
2
192.168.195.180:6379> TYPE color
list
192.168.195.180:6379> set name zhangsan
OK
192.168.195.180:6379> TYPE name
string
随机返回key RANDOMKEY
192.168.195.180:6379> mset age 18 score 88 sex boy
OK
192.168.195.180:6379> RANDOMKEY
sex
192.168.195.180:6379> RANDOMKEY
color
192.168.195.180:6379> RANDOMKEY
sex
查看所有key Keys *
192.168.195.180:6379> Keys *
color
score
sex
age
数据迁移数据库 Move
192.168.195.180:6379> move age 1
1
192.168.195.180:6379> select 1 (进入第二个数据库)
OK
192.168.195.180:6379[1]> get age
18