Redis是NoSql数据库。
NoSql数据库:
为了解决高并发、高可用、高可扩展性,大数据存储等一系列问题而产生的数据库解决方案,即非关系型数据库。
不能替代关系型数据库,只能作为补充。
redis支持数据类型:
1、字符串(String)。二进制安全的(存入取出值一致),value最长512M。
2、哈希(hash)。
3、字符串列表(list),链表结构。
4、字符串集合(set)。
5、有序字符串集合Zset(sorted set)。
key值的定义:
1、长度不要超过1024字节,且含义要清晰规范。保证可读性。
2、具有统一的命名规范。如rel结尾代表角色关系表。
redis应用情景:
1、缓存(数据查询、短连接、新闻内容、商品内容等待)(应用最多)
2、分布式集群架构中的session分离。
3、聊天室的在线好友列表。
4、任务队列。(秒杀、抢购、12306等等)。
5、应用排行榜。
6、网站访问统计。
7、数据过期处理。(可以精确到毫秒)
Redis 安装(控制台操作):
1、将tar包传入linux。
2、安装gcc编译器,yum install gcc-c++
3、将redis3.0.0的tar包解压到/usr/local/中
4、进入/usr/local/redis3.0.0中,使用make指令编译 #make
5、当前目录中使用make PREFIX=/usr/local/redis install 指令安装redis到local目录下。
6、拷贝redis3.0.0中的redis.conf到redis的bin目录下。
7、使用 . /redis-server redis.conf进行后台启动。直接使用. /redis-server是普通启动。
8、bin目录下使用 . /redis-cli连接redis。即可访问里面的数据。
存储数据:
1、打开redis,执行 . /redis-server redis.conf。
2、连接redis,执行 . /redis-cli。
3、执行set key值 value值,写入数据;执行get key值,读取value数据。
开启与关闭:
控制台启动: 直接使用. /redis-server是普通启动
关闭:
强制关闭:ctrl+c
正常关闭:bin目录下使用 . /redis-cli shutdown
后台启动: . /redis-server redis.conf启动。
关闭:
强制关闭: 查看后台进程 ps -aux | grep redis,使用kill -9 进程号杀死进程。容易造成数据丢失,不会先进行持久化保存数据。
正常关闭:在bin目录使用 . /redis-cli shutdown,关闭redis。会先将数据先进行持久化操作,在关闭redis。
**远程访问linux中的redis:
开启端口远程访问:
第一步,修改防火墙:/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
第二步,永久保存生效:/etc/rc.d/init.d/iptables save
Web项目读写redis:
1、搭建项目,导入commons-pool2-2.3.jar包、jedis-2.7.0.jar包。
2、新建类,插件Jedis对象操作redis,通过构造函数指定目标host和port。
jedis连接池使用:
JedisPool类的使用:
JedisPool pool = new JedisPool(poolConfig(池配置对象),地址host,端口号port);
JedisPoolConfig:
用于封装创建JedisPool对象时需要配置的信息。
JedisPoolConfig poolConfig = new JedisPoolConfig();
例:
public void test2(){
//创建redis连接池配置封装对象
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMinIdle(10); //最小闲置个数
poolConfig.setMaxIdle(30); //最大闲置个数
poolConfig.setMaxTotal(50); //最大连接数
//创建redis连接池
JedisPool jedisPool = new JedisPool(poolConfig,"192.168.111.132",6379);
//从连接池中获取redis的连接资源
Jedis jedis = jedisPool.getResource();
//操作数据库
jedis.set("性别", "女");
System.out.print("姓名:"+jedis.get("name")+",年龄:"+jedis.get("age")+",性别"+jedis.get("性别"));
jedis.close();
poolConfig.clone();
}
存取String类型:
jedis操作方法:
set:更改数据或新增数据。
get:获取value。
getset:先获取在修改。
del:删除。
incr:自增1。不存在的key时,会新建此key且自增1。
incrby num 9。等于num+=9。
decr:自减1。
decrby num 9。等于num-=9。
append num xxx。拼接num值和xxx。
存取Hash:
Hash类型可以看做是Map。适合存取对象信息。每一个Hash可以存储4294967295个键值对。
hset操作方法:
hset myhash name tom :设置或添加name属性。
hget myhash name:获取myhash的name属性值。
hgetall myhash:获取myhash的所有value值。
hmset操作方法:
hmset myhash name tom age 25 addr gaungzhou:设置多个
hmget myhash name age addr:获取myhash指定key的value值。
del:
hdel myhash name:删除myhash例的name属性。
del myhash:删除myhash所有内容。
hincrby myhash age 1 :myhash的age自增1。
hdecrby myhash age 1:myhash的age自减1。
hexists myhash age :myhash中是否有属性age。
hlen myhash :myhash里的field个数。
hkeys myhash :获取myhash所有的key。
hvals myhash :获取myhash的所有value。
存取List:(链表结构)
lpush mylist a b c d:从名为mylist的list头部开始插入元素a,b,c,d。
lrange mylist 0 -1:查询名为mylist的list从头到尾的元素内容。(d,c,b,a)。
rpush mylist e f g:从名为mylist的list尾部开始插入e,f,g。(d,c,b,a,e,f,g)
lpop mylist :删除名为mylist的list第一个元素,并返回此元素值。
rpop mylist :删除名为mylist的list最后一个元素,并返回此元素值。
llen mylist :查询mylist的元素个数。
lpushx mylist d:当mylist中没有d是,从头部插入d。已存在d,则不操作。(先查后插)。
rpushx:同上,从尾部操作。
lrem mylist 2 a:从左到右删除mylist两个值为a的元素。当数字为0是,则从右到左删除所有值为a的元素。正数为从左到右,负数则从右到左。
lset mylist 2 pp:从左到右替换位置下标值为2的的元素的值为pp。
linsert mylist after a yyy:在元素值为a的元素后面插入yyy元素。
rpoplpush mylist1 mylist2:从mylist1的尾部取出一个元素(删除),放到mylist2的头部。(可以实现遍历mylist1内容,筛选放置到不同的集合中,可以通过代码修改目标表)
存储Set集合:不允许重复数据,无序。
sadd myset a b c:向myset添加a,b,c
smembers myset:查询myset的全部元素。
srem myset b:删除b元素。
sismember myset a :查询myset当中是否存在a,存在返回1,不存在返回0。
del myset:删除全部
scard myset1:求出myset1的元素个数。
srandmember myset:随机获取myset中的一个元素。
集合运算:
求差集:sdiff myset1 myset2,求出myset1比myset2多出的。
sdiff myset2 myset1,求出myset2比myset1多出的。
sdiffstore destination myset1 myset2:求出差集存放到destination集合中。
求交集:sinter myset1 myset2,求出双方都有的。
sinterstore destination myset1 myset2:求出交集存放到destination集合中。
求并集:sunion myset1 myset2,求出双方的和,不重复。
sunionstore destination myset1 myset2:求出并集存放到destination集合中。
存储(Zset)sorted set:有顺序的set,通过权重(score分数)排序。
zadd mysortset score member score2 member2:插入分数为scor的元素member。
例:zadd 70 member 80 member2
zrange mysortset 0 -1:查询全部元素,无序。
zrange mysortset 0 -1 withscores : 查询全部元素,有序,从小到大。
zrevrange mysortset 0 -1 withscores: 查询全部元素,有序,从大到小。
zrangebyscore mysortset 0 100 limit 0 3: 从小到大查询score值0到100的元素,并从第0个开始取前三个。
zcard mysortset
zscore member2:返回member2的score值。
zrem mysortset member2:删除元素member2.
zremrangebyrank mysortset 0 2 :按照从小到大删除前三个元素(第0,1,2)。
zremrangebyscore mysortset withscores 30 50:删除score在30到50之间的元素(包括)。
zincrby mysortset increment member:增加member的权重score,增加量为increment。
zcount mysortset 30 100:统计权重在30到100之间的元素个数。
zrank mysortset f:查询f元素在mysortset里面的权重排名(从小到大)。
zrevrank mysortset f:查询f元素在mysortset里面的权重排名(从大到小)。
通用key操作:
keys *:查询所有key。
keys my*:查询所有以my开头的key。
del num:删除key为num的元素。
exists num:判断key是否存在,1代表存在,0代表不存在。
rename num newkey :为key为num的重命名。
expire num 1000 :设置过期时间,设置为1000秒,单位秒。默认为-1;-2表示设了超时,且已超时。
ttl key : 取得key的过期时间。
type num:查询key为num的数据类型。
**redis特性:
多数据库:**
redis最多提供16个数据库,下标从0到15。
使用select语句选择连接数据库。例:select 2,连接到2号库。
move num 2:移动当前库中的num数据到2号库中。
flushall:删除所有数据库的所有key。
消息订阅与发布:
subscribe channel:订阅频道。
例:subscribe cctv:订阅了cctv。
publish channel message:频道channel发布信息message。
例:publish cctv hi:通过cctv发布消息hi,此时订阅cctv的都会接受到hi信息。
redis事务:(不会回滚,相当于批处理)
multi:开启事务。
exec:提交事务。
discard:回滚事务。
redis持久化:
RDB模式:默认的持久化方式,快照写入磁盘,redis的bin目录下。启动时会加载。
AOF模式:日志的形式,操作命令记录,启动时会读取并重新构建数据库。
可以同时使用RDB和AOF模式。
RDB优势:
数据量大时更好,重新启动读取更高效。
劣势:
两次定时持久化之间,宕机的话,这个时间段的数据将丢失。
RDB的持久化存储配置:
在redis的bin目录下的redis . conf中配置。
save 900 1 : 900s内修改key1次,就会存一次快照。
save 300 10 :300s内修改key10次,就会存一次快照。
save 60 1000 :60秒内修改key1000次,就会存一次快照。
持久化文件名:通过修改 dbfilename 属性配置。
持久化文件保存路径:通过修改 dir 属性配置。
AOF的持久化存储配置:
AOF的优势:保存及时。
AOF的劣势:每次重启都执行日志中保存的操作记录,重建数据库。资源消耗大。
开启方式:配置redis . conf中的appendonly参数值。
always值:每次有数据修改发生都会写入AOF文件。多人操作时,较频繁。
everysec值:每秒钟同步一次,该策略为AOF的缺省策略。少人操作时,较频繁。
no值:从不同步。高效但是数据不会被持久化。
redis主从复制:
用途,避免单点故障。从机用作备份,可读无写权限。
主机:
无须配置。
从机:
配置redis . conf例的slaveof参数。
例: slaveof 192.168.111.133(从机ip) 6379(从机redis服务端口号)
清除从机中redis的持久化文件。
主从机之间,保证ip地址不一样或者端口号不一样。
注意,主机一旦发生操作,主机会把数据同步到从机中。
从机不能写。
*主从切换,可上网查看。
redis集群
1、所有的redis主机彼此互联,通过(PING-PONG机制),使用二进制协议优化传输速率和带宽。相当于Redis扩充。建议奇数个主机。
2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
3、客户端与redis节点直连,不需要中间proxy层,客户端不需要连接所有节点,连接其一即可。
4、redis-cluster把所有的物理节点映射到 [ 0 - 16383 ] slot上,cluster负责维护 node<-> slot <-> value。
redis集群中内置了16384个哈希槽,redis会对key使用crc16算法算出一个结果,然后把结果对16384取余,得出一个值(即哈希槽的值),那么每个key都会有一个对应的key,再将要存的值放到该槽中。
。。。详见<集群原理及搭建>