Redis的简介、安装、使用以及Jedis

版权声明:@CopyRight转载请注明出处 https://blog.csdn.net/LI_AINY/article/details/86508024

一、Redis简介
常用指令: 请点击
1.关于关系型数据库和nosql数据库
关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据库是基于特殊的结构,并将数据存储到内存的数据库。从性能上而言,nosql数据库要优于关系型数据库,从安全性上而言关系型数据库要优于nosql数据库,所以在实 际开发中一个项目中nosql和关系型数据库会一起使用,达到性能和安全性的双保证。

2.为什么要使用Redis
(一)性能
如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。
在这里插入图片描述
(二)并发

如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。

在这里插入图片描述

二. Redis的安装
Redis是c语言开发的。
安装redis需要c语言的编译环境。如果没有gcc,需要在线安装。yum install gcc-c++

安装步骤:
第一步:redis的源码包上传到linux系统。
第二步:解压缩redis。
第三步:编译。进入redis源码目录。直接输入make
第四步:安装。make install PREFIX=/usr/local/redis
PREFIX参数指定redis的安装目录。一般软件安装到/usr目录下
1 连接redis
1.1 redis的启动:
前端启动:在redis的安装目录bin下直接启动redis-server

[root@localhost bin]# ./redis-server 

后台启动:
把/root/redis-3.0.0/redis.conf复制到/usr/local/redis/bin目录下

[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis/bin/

修改配置文件:
在这里插入图片描述

[root@localhost bin]# ./redis-server redis.conf

查看redis进程:

[root@localhost bin]# ps aux|grep redis
root      5190  0.1  0.3  33936  1712 ?        Ssl  18:23   0:00 ./redis-server *:6379    
root      5196  0.0  0.1   4356   728 pts/0    S+   18:24   0:00 grep redis
[root@localhost bin]# 

1.2 Redis-cli

[root@localhost bin]# ./redis-cli 

默认连接localhost运行在6379端口的redis服务。

扫描二维码关注公众号,回复: 5045524 查看本文章
[root@localhost bin]# ./redis-cli -h 192.168.25.153 -p 6379

-h:连接的服务器的地址
-p:服务的端口号

关闭redis:

[root@localhost bin]# ./redis-cli shutdown

在这里插入图片描述

在这里插入图片描述

二、使用java去操作Redis

三、Redis的常用命令
redis是一种高级的key-value的存储系统
其中的key是字符串类型,尽可能满足如下几点:
1)key不要太长,最好不要操作1024个字节,这不仅会消耗内存还会降低查找 效率
2)key不要太短,如果太短会降低key的可读性
3)在项目中,key最好有一个统一的命名规范(根据企业的需求)
其中value 支持五种数据类型:
1)字符串型 string
2)字符串列表 lists
3)字符串集合 sets
4)有序字符串集合 sorted sets
5)哈希类型 hashs

我们对Redis的学习,主要是对数据的存储,下面将来学习各种Redis的数据类型的存储操作:

1.存储字符串string
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M
在这里插入图片描述
1)set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖 操作。总是返回”OK”
2)get key:获取key的value。如果与该key关联的value不是String类型,redis 将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返回null。
在这里插入图片描述
3)getset key value:先获取该key的值,然后在设置该key的值。
在这里插入图片描述
4)incr key:将指定的key的value原子性的递增1.如果该key不存在,其初始值 为0,在incr之后其值为1。如果value的值不能转成整型,如hello,该操作将执 行失败并返回相应的错误信息。
5)decr key:将指定的key的value原子性的递减1.如果该key不存在,其初始值 为0,在incr之后其值为-1。如果value的值不能转成整型,如hello,该操作将执 行失败并返回相应的错误信息。
在这里插入图片描述

6)incrby key increment:将指定的key的value原子性增加increment,如果该key不存在,器初始值为0,在incrby之后,该值为increment。如果该值不能转成 整型,如hello则失败并返回错误信息
7)decrby key decrement:将指定的key的value原子性减少decrement,如果 该key不存在,器初始值为0,在decrby之后,该值为decrement。如果该值不能 转成整型,如hello则失败并返回错误信息
在这里插入图片描述
8)append key value:如果该key存在,则在原有的value后追加该值;如果该 key 不存在,则重新创建一个key/value
在这里插入图片描述
2.存储lists类型
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
在这里插入图片描述
1)lpush key value1 value2…:在指定的key所关联的list的头部插入所有的 values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链 表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
2)rpush key value1、value2…:在该list的尾部添加元素
3)lrange key start end:获取链表中从start到end的元素的值,start、end可 为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,依次类推…

在这里插入图片描述
4)lpushx key value:仅当参数中指定的key存在时(如果与key管理的list中没有值时,则该key是不存在的)在指定的key所关联的list的头部插入value。
5)rpushx key value:在该list的尾部添加元素
在这里插入图片描述
6)lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。
7)rpop key:从尾部弹出元素。
在这里插入图片描述
8)rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部
在这里插入图片描述
9)llen key:返回指定的key关联的链表中的元素的数量。
在这里插入图片描述
10)lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元 素,-1代表链表的尾元素。

在这里插入图片描述

在这里插入图片描述

3.存储sets类型
在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我 们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间是常量时间。Set可包含的最大元素数是4294967295。
和List类型不同的是,Set集合中不允许出现重复的元素。和List类型相比,Set类 型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销
在这里插入图片描述
1)sadd key value1、value2…:向set中添加数据,如果该key的值已有则不会重复添加
2)smembers key:获取set中所有的成员
3)scard key:获取set中成员的数量
在这里插入图片描述
4)sismember key member:判断参数中指定的成员是否在该set中,1表示存 在,0表示不存在或者该key本身就不存在
5)srem key member1、member2…:删除set中指定的成员
在这里插入图片描述
6)srandmember key:随机返回set中的一个成员
在这里插入图片描述
4. 存储sortedset
Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。
在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为 集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis 同样的高效,在其它数据库中进行建模是非常困难的。
例如:游戏排名、微博热点话题等使用场景。
在这里插入图片描述
1)zadd key score member score2 member2 … :将所有成员以及该成员的 分数存放到sorted-set中
2)zcard key:获取集合中的成员数量
在这里插入图片描述

4.存储hash
Redis中的Hashes类型可以看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果 Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash 可以存储4294967295个键值对。
在这里插入图片描述
1)hset key field value:为指定的key设定field/value对(键值对)。
2)hgetall key:获取key中的所有filed-vaule
在这里插入图片描述
3)hget key field:返回指定的key中的field的值
在这里插入图片描述
4)hmset key fields:设置key中的多个filed/value

5)hmget key fileds:获取key中的多个filed的值
6)hexists key field:判断指定的key中的filed是否存在
7)hlen key:获取key所包含的field的数量
8)hincrby key field increment:设置key中filed的值增加increment,如:age 增加20

5. Key命令
设置key的过期时间。
Expire key second:设置key的过期时间
Ttl key:查看key的有效期
Persist key:清除key的过期时间。Key持久化。

192.168.25.153:6379> expire Hello 100
(integer) 1
192.168.25.153:6379> ttl Hello
(integer) 77
  1. Redis的持久化方案
    Redis的所有数据都是保存到内存中的。
    Rdb:快照形式,定期把内存中当前时刻的数据保存到磁盘。Redis默认支持的持久化方案。
    aof形式:append only file。把所有对redis数据库操作的命令,增删改操作的命令。保存到文件中。数据库恢复时把所有的命令执行一遍即可。
    在redis.conf配置文件中配置。
    Rdb:
    在这里插入图片描述
    AOF的配置:
    在这里插入图片描述
  2. Jedis(java+redis)
    需要把jedis依赖的jar包添加到工程中。Maven工程中需要把jedis的坐标添加到依赖。
    3.1 连接单机版
    第一步:创建一个Jedis对象。需要指定服务端的ip及端口。
    第二步:使用Jedis对象操作数据库,每个redis命令对应一个方法。
    第三步:打印结果。
    第四步:关闭Jedis
@Test
	public void testJedis() throws Exception {
		// 第一步:创建一个Jedis对象。需要指定服务端的ip及端口。
		Jedis jedis = new Jedis("192.168.25.15", 6379);
		// 第二步:使用Jedis对象操作数据库,每个redis命令对应一个方法。
		String result = jedis.get("hello");
		// 第三步:打印结果。
		System.out.println(result);
		// 第四步:关闭Jedis
		jedis.close();
	}

3.1 .2连接单机版使用连接池
第一步:创建一个JedisPool对象。需要指定服务端的ip及端口。
第二步:从JedisPool中获得Jedis对象。
第三步:使用Jedis操作redis服务器。
第四步:操作完毕后关闭jedis对象,连接池回收资源。
第五步:关闭JedisPool对象。

@Test
	public void testJedisPool() throws Exception {
		// 第一步:创建一个JedisPool对象。需要指定服务端的ip及端口。
		JedisPool jedisPool = new JedisPool("192.168.25.15", 6379);
		// 第二步:从JedisPool中获得Jedis对象。
		Jedis jedis = jedisPool.getResource();
		// 第三步:使用Jedis操作redis服务器。
		jedis.set("jedis", "test");
		String result = jedis.get("jedis");
		System.out.println(result);
		// 第四步:操作完毕后关闭jedis对象,连接池回收资源。
		jedis.close();
		// 第五步:关闭JedisPool对象。
		jedisPool.close();
	}
@Test
	public void testThree() throws Exception {
		/**
		 * 将不经常修改的数据,放置在redis中。
		 */
		
		
		/**
		 * 
		 * {"image":"http:\/\/image.ibuy.cn\/jd\/de2b4d7ab622453784661781a42c70ae.jpg",
		 * "sellPoint":"特价促销!纤薄机身,高通骁龙1.4GHz四核处理器,7.0mm纤薄机身,5.3英寸屏!",
		 * "created":"2017-03-08 21:28:30","price":119900,"num":99999,"id":1180464,
		 * "title":"索尼(SONY) Xperia T3 (M50w) 白色 联通3G手机","updated":"2017-03-08 21:28:30",
		 * "barcode":null,"status":1,"cid":560}
		 *  
		 * TbItem
		 * set/get
		 * 
		 */
		
		TbItemExample example = new TbItemExample();
		Criteria criteria = example.createCriteria() ;
		List<TbItem> list = itemMapper.selectByExample(example) ;
		
		Jedis jedis = new Jedis("192.168.25.12",6379) ;
		
		/*String json = JSON.json(list) ;
		System.out.println(json);*/
		
		String json = jedis.hget("item", "1180464") ;
		
		ObjectMapper mapper = new ObjectMapper() ;
		
		TbItemInfo tbItemInfo = mapper.readValue(json, TbItemInfo.class) ;
		
		/**
		 * HttpSession session = request.getSession() ;
		 * 
		 * session.setAttribute("userInfo",tbItemInfo) ;
		 */
		
		
		System.out.println(tbItemInfo);
		
		/*if(json != null) {
			System.out.println(json);
		}else {
			//从数据库中再查询
			System.out.println("从数据库执行了查询");
		}*/
		
		/*for(TbItem tbItem : list) {
			jedis.hset("item", tbItem.getId()+"", JSON.json(tbItem)) ;
		}*/
		
		jedis.close();

猜你喜欢

转载自blog.csdn.net/LI_AINY/article/details/86508024