一、认识
(1)Redis是一个开源的使用C语言编写、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
(2)Redis的数据类型5种:
类型 | 说明 | 常用相关命令 |
---|---|---|
字符串(string) | key-value,key是区分大小写的 | get查、set增、incr把值加1、Desc把值减1 |
哈希表(hashs) | key-fields-values | Hset增、Hget查、Hdel删 |
列表(lists) | 有顺序,可重复 | Lpush增入头部、rpush增入尾部、Lrange查、Lpop删第一个、rpop删最后一个 |
集合(sets) | 无顺序,不可重复 | sadd增、smembers查、srem删 |
有序集合(sorts sets) | 有顺序,不可重复 | zadd增、zrange正序查、zreverange反序查、zrem删、 |
(3)做缓存的时候用的最多的是string,这个是种key-value的形式
其次是hashs,相当于key-的形式,不过value还可以继续key-value的形式。hashs可以把内容归类。
(4)注意点:Redis是单线程的,redis把所有的数据放到内存里,内存是比较小的,内存满了就去找虚拟内存,也就是硬盘,这样子就会频繁内存与硬盘交换数据,性能降低,所以不适合保存内容大的数据,是主要用于解决高并发的数据库,Redis里面存的都是字符串。
(5)redis常用命令:
127.0.0.1:6379> set strone 123one //设置一个字符串strone
OK
127.0.0.1:6379> get strone //查看字符串strone
"123one"
127.0.0.1:6379> hset hashone fieldone abcone //设置一个哈希表的key为hashone,域叫fieldone
(integer) 1
127.0.0.1:6379> hget hashone fieldone //查看hashone表里面的域fieldone
"abcone"
127.0.0.1:6379> keys * //查看现在有几个key
1) "hashone"
2)“strone”
//下面是关于KEY命令的,也很重要
127.0.0.1:6379> ttl strone //查看key strone的有效期
(integer) -1 //-1:key永久保存,-2:key不存在,正数:正在倒计时过期
127.0.0.1:6379> expire strone 100 //设置key strone的有效期为100秒
(integer) 1
127.0.0.1:6379> ttl strone //过了10秒后查看keystrone的有效期
(integer) 90 // keystrone的有效期只剩下90秒
127.0.0.1:6379> ttl strone //过了100秒后查看key strone的有效期
(integer) -2 //不存在叫做strone的key
(6)redis的持久化方案
一种是rdb(快照形式):默认方式,定期把内存中当前时刻的数据保存到磁盘,性能比较好。
一种是aof(append only file):把对redis数据库操作的命令,保存到文件中。数据库恢复时把所有命令执行一遍即可,数据完整性比较高。
△两种持久化方案可以同时开启,使用aof文件来恢复数据库
(7)缓存里面东西越用越多了怎么办?
这时候就需要集群了,也就是多开几个redis服务器,参考我的另外一文档:
redis集群的认识、搭建、使用--------https://blog.csdn.net/ranandrun/article/details/83054460
二、安装和启动redis
(1)redis需要c语言的编译环境。需要安装gcc
查看是否有安装gcc:
这样子就是已经安装了
如果是command not fonud,就是还没安装,安装方法:
yum install gcc-c++
(2)下载redis-3.0.0.tar.gz到usr/redis/redis-install下面
解压:tar zxf redis-3.0.0.tar.gz
[root@localhost redis-3.0.0]# ll
total 144
-rw-rw-r--. 1 root root 25890 Apr 1 2015 00-RELEASENOTES
-rw-rw-r--. 1 root root 53 Apr 1 2015 BUGS
-rw-rw-r--. 1 root root 1439 Apr 1 2015 CONTRIBUTING
-rw-rw-r--. 1 root root 1487 Apr 1 2015 COPYING
drwxrwxr-x. 6 root root 4096 Apr 1 2015 deps
-rw-rw-r--. 1 root root 11 Apr 1 2015 INSTALL
-rw-rw-r--. 1 root root 151 Apr 1 2015 Makefile //c语言编译必须有makefile文件
-rw-rw-r--. 1 root root 4223 Apr 1 2015 MANIFESTO
-rw-rw-r--. 1 root root 5201 Apr 1 2015 README
-rw-rw-r--. 1 root root 41403 Apr 1 2015 redis.conf
-rwxrwxr-x. 1 root root 271 Apr 1 2015 runtest
-rwxrwxr-x. 1 root root 280 Apr 1 2015 runtest-cluster
-rwxrwxr-x. 1 root root 281 Apr 1 2015 runtest-sentinel
-rw-rw-r--. 1 root root 7109 Apr 1 2015 sentinel.conf
drwxrwxr-x. 2 root root 4096 Apr 1 2015 src //全部c语言的源代码
drwxrwxr-x. 10 root root 4096 Apr 1 2015 tests
drwxrwxr-x. 5 root root 4096 Apr 1 2015 utils
然后命令行里面输入make,就开始编译了
编译完之后会生成redis-server和redis-cli等几个文件
然后开始正式开始安装redis:
[root@localhost redis-3.0.0]# make install PREFIX=/usr/redis/redis
安装完毕
(3)启动redis-server
在bin目录下输入命令:
./redis-server
这种是前端启动模式,这种前端启动模式会占用一个终端。
一般推荐用后端启动模式,方法如下:
在安装文件里面复制一份redis.conf到redis的bin目录下
[root@localhost redis-3.0.0]# cd /usr/redis/redis/bin
[root@localhost bin]# cp /usr/redis/redis-install/redis-3.0.0/redis.conf .
编辑redis.conf,把GERERAL里面的daemonize no 改为daemonize yes,这个就是daemonize 就是后台运行的意思
然后启动redis
[root@localhost bin]# ./redis-server redis.conf
查看是否启动成功:用进程查看
[root@localhost bin]# ps aux|grep redis
看到这两个,就是成功,它的端口号为6379
三、开启redis-server后如何去使用
(1)连接 本地虚拟机开启的redis-server
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> ping
PONG
这样子就是连上了本地虚拟机的redis-server
(2)连接别的机子的虚拟机的redis-server
[root@localhost bin]# ./redis-cli -h 192.168.25.129 -p 6379
192.168.25.129:6379> ping
PONG
这样子就是连上了别的机子的虚拟机的redis-server,主要改下ip地址和端口号就可以了
(3)我们最主要掌握的还是用java的客户端Jedis去连接redis-server
<1> 导入包
<!-- Redis客户端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<2>创建一个测试类,测试一下:
public class TestJedis {
@Test
public void testJedis() throws Exception {
//创建一个jedis对象,需要指定服务的ip和端口号
Jedis jedis = new Jedis("192.168.25.129", 6379);
//直接操作数据库
jedis.set("jedis-key-test", "1234");
String result = jedis.get("jedis-key-test");
System.out.println(result);
//关闭jedis
jedis.close();
}
}
这种方法不太好,每次操作redis都得创建一个连接,这样子比较浪费资源,所以建议创建一个连接池,方法如下:
@Test
public void testJedisPool() throws Exception {
//创建一个数据库连接池对象(单例),需要指定服务的ip和端口号
//数据库连接池对象是单例的,就是说整个系统只有一个
JedisPool jedisPool = new JedisPool("192.168.25.129", 6379);
//从连接池中获得连接
Jedis jedis = jedisPool.getResource();
//使用Jedis操作数据库
//这里的Jedis操作是方法级别的,就是说在一个方法里面用,同时在这方法里面关闭
String result = jedis.get("jedis-key-test");
System.out.println(result);
//一定要关闭Jedis连接
jedis.close();
//系统关闭前关闭连接池
jedisPool.close();
}