Redis
概念:redis是一款高性能的NOSQL系列的非关系型数据库
什么是NOSQL?
NOSQL意为NOT ONLY SQL,即不仅仅是SQL,泛指非关系型数据库。随着Web2.0网站的兴起,传统的非关系型数据库应付Web2.0网站,特别是大规模和高并发的SNS类型的纯动态网站已经显得力不从心。NOSQL数据库的出现为的就是解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NOSQL和SQL比较
* 优点:
* 成本:NOSQL数据库简单易部署,基本都是开源软件,不需要想Oracle那样花费大量成本购买使用;
* 查询速度:NOSQL数据库将数据存储在缓存中,关系型数据库将数据存储在硬盘之中,查询速度自然不如NOSQL
* 存储数据的格式:NOSQL的存储格式是key、value形式、文档形式、图片形式等,可以存储基础类型以及对象或集合等各种格式,而关系型数据库只支持基础类型。
* 扩展性:关系型数据库由类似join这样的多表查询机制限制导致扩展困难
* 缺点:
* 维护的工具和资料有限,因为NOSQL是新的技术,发展并没有SQL数据库那么完善
* 不提供对SQL的支持,将产生一定的学习和使用成本
* 不提供关系型数据库对事务的处理
* 关系型数据库与非关系西数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NOSQL的适合使用NOSQL数据库,让NOSQL数据库对关系型数据库的不足进行弥补。一般会将数据存储在关系型数据库中,在NOSQL的数据库中去备份存储关系型数据库的数据。
什么是Redis?
Redis是一款用C语言开发的开源的高性能键值对数据库,目前Redis支持的键值数据类型如下:
字符串类型string 哈希类型hash 列表类型list 集合类型set (无重复元素) 有序集合类型sortedset (无重复元素,并且有序)
Redis的应用场景
缓存(数据查询、短连接、新闻内容、商品内容。。。) 聊天室的在线好友列表 任务队列(秒杀、抢购、12306等) 应用排行榜 网站访问统计 数据过期处理 分布式集群架构中的session分离
下载安装
官网:https://redis.io(比较慢,服务器在国外) redis中文网:http://www.redis.nett.cn/ 解压直接可以使用
redis.windows.conf 配置文件 redis-cli.exe redis客户端 redis-server.exe redis服务器端
命令操作
redis的数据结构:
redis存储的是:key,value格式的数据,其中key是字符串,value有5种不同的数据结构 字符串类型string 哈希类型hash :map格式 列表类型list :linkedlist格式 集合类型set 有序集合类型sortedset
字符串类型 string
存储:set key value 获取:get key 删除:del key
哈希类型 hash
存储:hset key field value 获取:hget key field (获取指定field对应的值) / hgetall key (获取map中所有的值) 删除:hdel key field
列表类型 list :可以添加一个元素到了列表的头部(左边)或者尾部(右边)
添加:
lpush key value:将元素加入列表左边 rpush key value:将元素加入列表右边
获取:lrange key start end:范围获取 删除:
lpop key:删除列表最左边的元素,并将元素返回 rpop key:删除列表最右边的元素,并将元素返回
集合类型 set:不允许重复元素
存储:sadd key value 获取:smembers key:获取set集合中所有元素 删除:srem key value:删除set集合中某一个元素
有序集合类型sortedset :不允许重复元素,且元素有序
存储:zadd key score value 获取:zrange key start end 删除:zrem key value
通用命令:
keys *:查询所有的键 type key:查询指定key的类型 del key:删除指定的key、value
持久化
redis是一个内存数据库,当redis服务器重启,或者电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。 redis持久化机制:
RDB:默认方式,不需要进行配置。
* 在一定的间隔时间中,检测key的变化情况,然后持久化数据
编辑redis.windows,conf文件
// after 900 sec (15 min) if at least 1 key changed save 900 1 // after 300 sec (5 min) if at least 10 keys changed save 300 10 // after 60 sec if at least 10000 keys changed save 60 10000
打开命令行,重新启动redis服务器,并指定配置文件名称
redis-server.exe redis.windows.conf 当更改redis数据时,会根据配置文件设置的时间条件生成.db文件
AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后来持久化数据
编辑redis.windows,conf文件
appendonly yes(开启AOF) appendfsync always:每一次操作都进行持久化 appendfsync everysec:每隔一秒进行一次持久化 appendfsync no:不进行持久化
打开命令行,重新启动redis服务器,并指定配置文件名称
redis-server.exe redis.windows.conf
Java客户端Jedis
一款java操作redis数据的工具 使用步骤:
jedis操作各种redis数据结构
package com. tcj. jedis. test ;
import org. junit. Test ;
import redis. clients. jedis. Jedis ;
import java. util. List ;
import java. util. Map ;
import java. util. Set ;
public class jedisTest {
@Test
public void test1 ( ) {
Jedis jedis = new Jedis ( "localhost" , 6379 ) ;
jedis. set ( "username" , "zhangsan" ) ;
jedis. close ( ) ;
}
@Test
public void test2 ( ) {
Jedis jedis = new Jedis ( ) ;
jedis. set ( "username" , "zhangsan" ) ;
String username = jedis. get ( "username" ) ;
System . out. println ( username) ;
jedis. setex ( "activecode" , 20 , "aaa" ) ;
jedis. close ( ) ;
}
@Test
public void test3 ( ) {
Jedis jedis = new Jedis ( ) ;
jedis. hset ( "user" , "name" , "lisi" ) ;
jedis. hset ( "user" , "age" , "23" ) ;
jedis. hset ( "user" , "sex" , "male" ) ;
String name = jedis. hget ( "user" , "name" ) ;
System . out. println ( name) ;
Map < String , String > user= jedis. hgetAll ( "user" ) ;
Set < String > keySet = user. keySet ( ) ;
for ( String key: keySet) {
String value = user. get ( key) ;
System . out. println ( key+ ":" + value) ;
}
jedis. close ( ) ;
}
@Test
public void test4 ( ) {
Jedis jedis = new Jedis ( ) ;
String elem1 = jedis. lpop ( "mylist" ) ;
System . out. println ( elem1) ;
System . out. println ( jedis. rpop ( "mylist" ) ) ;
jedis. close ( ) ;
}
@Test
public void test5 ( ) {
Jedis jedis = new Jedis ( ) ;
jedis. sadd ( "myset" , "java" , "php" , "python" ) ;
Set < String > myset = jedis. smembers ( "myset" ) ;
System . out. println ( myset) ;
jedis. close ( ) ;
}
@Test
public void test6 ( ) {
Jedis jedis = new Jedis ( ) ;
jedis. zadd ( "mysortedset" , 1 , "aaa" ) ;
jedis. zadd ( "mysortedset" , 3 , "bbb" ) ;
jedis. zadd ( "mysortedset" , 6 , "ccc" ) ;
Set < String > mysortedset = jedis. zrange ( "mysortedset" , 0 , - 1 ) ;
System . out. println ( mysortedset) ;
jedis. close ( ) ;
}
}