视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQLredis学习与应用
2020-11-09 09:10:21 责编:小采
文档


诸如mysql等关系型数据库,在数据存储在高并发情况下读写性能有所,Nosql(非关系型数据库)便应运而生,弥补了关系型数据库的不足。

【简介】

redis是作为一种key-value存储形式的Nosql数据库,得到广泛的应用,它支持主从复制,事务处理,乐观锁复杂事务控制,持久化,发布及订阅消息等特性。

【数据类型介绍】

redis的数据类型相对关系型数据库较为简单,分为5大类型,分别是:string,hashs,lists,sets,sorted set。

1. string类型是二进制、安全的数据类型,可以存放jps图片或者序列化对,常用的redis数据库命令为:

<span style="font-family:KaiTi_GB2312;">	
</span>
<span style="font-family:SimSun;">a. Set name lijie ----设置name=lijie
	b. Setnx 设置如果name存在,则返回0,设置不成功(nx--not exit)
	c. Setex 指定有效期:set haircolor 10 red --10秒失效
	d. Setrange name 6 gmail.com ----从第6个开始设置
	e. Mset key1 lijie1 key2 lijei2 key3 lijie3 --设置多个键值对
	f. get --获得字符
	g. Getrange eamil 0 5 从下标为0到5的值
	h. Mget--批量返回
	i. Incr key6 --自增
	j. Incrby key5 6--以6来进行自增
	k. Decr/decrby
	l. Append key1 .net 在key1后面增加.net
	m. Strlen--返回长度</span><span style="font-family:KaiTi_GB2312;">
</span>

2. hashs类型占用的内存更少,常用命令:

	 <span style="font-family:SimSun;">a. Hset--hset user:001 name lijie
	b. Hsetnx--hsetnx user:002 name lamp
	c. Hmset---hmset user:003 name lijie age 20 sex 1
	d. Hincrby--自增
	e. Hexists--判断是否存在 hexits user:002 name
	f. Hlen----返回所有键数量
	g. Hdel--hdel user:003 age
	h. Hkeys --hkeys user:001
	i. Hvals---hvals user:003
	j. Hgetall---获取所有fileds和value</span>


3. lists数据类型分为链表结构和队列两种数据结构,常用命令:

	<span style="font-family:SimSun;">a. Lpush--从头部压入元素:lpush list1 "hello"--栈
	b. Lrang myliist 0 -1 从头部一直去不到尾部
	c. Rpush---rpush list2 "hello"---队列
	d. Linsert---linsert list2 before hello word
	e. Lset--指定下标赋值:lset list2 1 my
	f. Lrem--从list 中删除n个和value相同的值
	g. Ipop从头弹出元素
	h. Rpop 从尾部
	i. Rpoplpush
	j. Lindex---lindex list2 2
	k. Llen---返回长度</span>


4. sets类型支持并集,交集,叉集等操作,差用命令:

	<span style="font-family:SimSun;">a. Sadd--sadd myset1 one
	b. Smembers--查看
	c. Srem --srem myset2 "one"
	d. Spop--随机弹出
	e. Sdiff--两个集合的差集 
	f. Sdiffstor---叉集存储到指定sets里面:sdiffstore myset4 myset2 myset3
	g. Siner--返回交集/sinnerstore
	h. Sunion--并集/
	i. Smove---将第一个set中元素剪切到第二个set中 smove myset1 myset8 three
	j. Scard --查看个数
	k. Sismemeber---测试元素是不是set中元素
	l. Srandmember--随机返回元素不会删除</span>


5. sort set是一种有序集合:

	<span style="font-family:SimSun;">a. Zadd---zadd myzset “one”
	b. 取值:zrange myzet 0 -1 withscores(显示顺序)
	c. Zrem--zrem myzset two
	d. Zincrby--zincrby sset1 2 one--对顺序号进行增加
	e. Zrank--返回 索引:zrank myset3 two
	f. Zrevrank
	g. Zrerange--降序排序
	h. Zrangebyscore--按照范围返回:zrangebyscore sset2 2 4 with scores
	i. Zcount--返回数量 zcount seet2 2 4
	j. Zcard --返回 
	k. Zremrangebyrank--按照索引删除
	l. Zremrangebyscore--按照顺序删除</span>

【java应用】

redis在java中应用需要引入jar包:import redis.clients.jedis.Jedis;

不使用连接池的话,在代码中直接使用:Jedis client=new Jedis("ip地址",6379);,既可实现redis连接,当使用连接池时,创建连接池类:

package com.tgb.itoo.exam.students.controller;

import java.util.ResourceBundle;

import org.springframework.util.Assert;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisPoolTest {
	private static JedisPool jedisPool;
	
	private static JedisPoolConfig initPoolConfig(){
	 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); 
	 // 控制一个pool最多有多少个可用的的jedis实例 
//	 jedisPoolConfig.setMaxActive(1000); 
	 // 最大能够保持空闲状态的对象数 
	 jedisPoolConfig.setMaxIdle(300); 
	 // 超时时间 
	 jedisPoolConfig.setMaxWaitMillis(1000); 
	 // 在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的; 
	 jedisPoolConfig.setTestOnBorrow(true); 
	 // 在还会给pool时,是否提前进行validate操作 
	 jedisPoolConfig.setTestOnReturn(true); 
	 return jedisPoolConfig; 
	}
	
	 /** 
 * 初始化jedis连接池 
 * <br>------------------------------<br> 
 */ 
 
 public static void before() { 
 JedisPoolConfig jedisPoolConfig = initPoolConfig(); 
 // 属性文件读取参数信息 
 ResourceBundle bundle = ResourceBundle.getBundle("redis_config"); 
 String host = bundle.getString("redis.host"); 
 int port = Integer.valueOf(bundle.getString("redis.port")); 
 int timeout = Integer.valueOf(bundle.getString("redis.timeout")); 
 String password = bundle.getString("redis.password"); 
 // 构造连接池 
 jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password); 
 } 
 

 public void testSet() { 
 Jedis jedis = null; 
 // 从池中获取一个jedis实例 
 try { 
 jedis = jedisPool.getResource(); 
 jedis.set("blog_pool", "java2000_wl"); 
 } catch (Exception e) { 
 // 销毁对象 
 jedisPool.returnBrokenResource(jedis); 
// Assert.fail(e.getMessage()); 
 } finally { 
 // 还会到连接池 
 jedisPool.returnResource(jedis); 
 } 
 } 
}

管道技术应用

redis在连续执行写入操作时,为减少打开关闭数据库次数,创建管道可以提升性能,实战使用:

 Pipeline pipeline=client.pipelined();
	
	for (TemplateDetail templateDetail : templateDetails) {
	List<QuestionMain> questionMains=templateDetail.getQuestionMainList();
	for (QuestionMain questionMain : questionMains) {
	if(null!=questionMain){
	String redisKey=studenInfo.getStudentId()+"_"+studenInfo.getExamination_id()+"_"+questionMain.getId()+"_exam";
	
	try {
	pipeline.lpush(redisKey,JsonUtils.objectToJson(questionMain));
	pipeline.expire(redisKey, 7200);
	} catch (IOException e) {	
	e.printStackTrace();
	}	
	}
	}	
	}
	pipeline.sync();//管道执行

下载本文
显示全文
专题