Redis学习笔记(三)

原创 2015年11月18日 10:53:33

njb里redis的应用例子:

1、njb/pom.xml文件:

	<dependency>  
	        <groupId>redis.clients</groupId>  
	        <artifactId>jedis</artifactId>  
	        <version>2.1.0</version>  
    	</dependency> 
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.1.36</version>
	</dependency>

	<profiles>
		<!-- ================= Database Profiles ================= -->
		<profile>
			<id>test189</id>
			 <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
			<properties>
				<!-- Database settings -->
				<jdbc.url>jdbc:mysql://183.56.132.189/njb?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true</jdbc.url>
				<jdbc.username>njb</jdbc.username>
				<jdbc.password>njb2015</jdbc.password>
				......//省略很多
				<redis.album.host>183.56.132.189</redis.album.host>
				<redis.album.port>6379</redis.album.port>
				<redis.album.password/>
				<redis.album.database>0</redis.album.database>
				<redis.contactbook.host>183.56.132.189</redis.contactbook.host>
				<redis.contactbook.port>6379</redis.contactbook.port>
				<redis.contactbook.password/>
				<redis.contactbook.database>1</redis.contactbook.database>
				<redis.loginuser.host>183.56.132.189</redis.loginuser.host>
				<redis.loginuser.port>6379</redis.loginuser.port>
				<redis.loginuser.password/>
				<redis.loginuser.database>2</redis.loginuser.database>
				<redis.price.host>183.56.132.189</redis.price.host>
				<redis.price.port>6379</redis.price.port>
				<redis.price.password/>
				<redis.price.database>3</redis.price.database>
				<redis.readlog.host>183.56.132.189</redis.readlog.host>
				<redis.readlog.port>6379</redis.readlog.port>
				<redis.readlog.password/>
				<redis.readlog.database>4</redis.readlog.database>
				<redis.other.host>183.56.132.189</redis.other.host>
				<redis.other.port>6379</redis.other.port>
				<redis.other.password/>
				<redis.other.database>5</redis.other.database>
				<redis.notice.host>183.56.132.189</redis.notice.host>
				<redis.notice.port>6379</redis.notice.port>
				<redis.notice.password/>
				<redis.notice.database>6</redis.notice.database>
				......
			</properties>
		</profile>
		......
	</properties>

2、njb-service/src/main/resources/applicationContext-resources.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mongo="http://www.springframework.org/schema/data/mongo"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:cache="http://www.springframework.org/schema/cache"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:drools="http://drools.org/schema/drools-spring" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:c="http://www.springframework.org/schema/c"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       		http://www.springframework.org/schema/data/mongo	http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
            http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd
            http://www.springframework.org/schema/aop   
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://drools.org/schema/drools-spring 
		   http://drools.org/schema/drools-spring-1.3.0.xsd
           http://www.springframework.org/schema/context 
           http://www.springframework.org/schema/context/spring-context.xsd">
	<!--读取文本配置文件-->
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="ignoreUnresolvablePlaceholders" value="true" />
		<property name="properties" ref="configProperties" />
	</bean>

	<bean id="configProperties"
		class="org.springframework.beans.factory.config.PropertiesFactoryBean">
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
				<value>classpath:mail.properties</value>
				<value>classpath:hibernate.properties</value>
				<value>classpath:influxdb.properties</value>
				<value>classpath:redis.properties</value>
				<value>classpath:config.properties</value>
			</list>
		</property>
	</bean>
	........//JDBC之类很多配置
	<bean id="jedisPoolConfig" class="com.eshore.njb.util.JedisPoolConfigWrapper">
		<!--最大连接数 -->
		<property name="maxActive" value="500" />
		<!--最大空闲连接数 -->
		<property name="maxIdle" value="5" />
		<!--初始化连接数 -->
		<property name="minIdle" value="1" />
		<!--最大等待时间 -->
		<property name="maxWait" value="5000" />
		<!--对拿到的connection进行validateObject校验 -->
		<property name="testOnBorrow" value="true" />
		<!--在进行returnObject对返回的connection进行validateObject校验 -->
		<property name="testOnReturn" value="true" />
		<!--定时对线程池中空闲的链接进行validateObject校验 -->
		<property name="testWhileIdle" value="true" />
	</bean>
	<!--除了albumJedisConnection,还有contactbookJedisConnection,loginuserJedisConnection,priceJedisConnection等等连接redis多个数据库的配置-->
	<bean id="albumJedisConnection" class="com.eshore.framework.utils.JedisConnectionConfigWrapper">
		<property name="host" value="${redis.album.host}" />
		<property name="port" value="${redis.album.port}" />
		<property name="timeout" value="5000" />
		<property name="password" value="${redis.album.password}" />
		<property name="database" value="${redis.album.database}" />
	</bean>
<span style="white-space:pre">	</span><!--在需要的地方注入的就是albumJedisPool,或者otherJedisPool之类的-->
	<bean id="albumJedisPool" class="redis.clients.jedis.JedisPool"
		destroy-method="destroy">
		<constructor-arg name="poolConfig">
			<bean factory-bean="jedisPoolConfig" factory-method="getConfig" />
		</constructor-arg>
		<constructor-arg name="host">
			<bean factory-bean="albumJedisConnection" factory-method="getHost" />
		</constructor-arg>
		<constructor-arg name="port">
			<bean factory-bean="albumJedisConnection" factory-method="getPort" />
		</constructor-arg>
		<constructor-arg name="timeout">
			<bean factory-bean="albumJedisConnection" factory-method="getTimeout" />
		</constructor-arg>
		<constructor-arg name="password">
			<bean factory-bean="albumJedisConnection" factory-method="getPassword" />
		</constructor-arg>
		<constructor-arg name="database">
			<bean factory-bean="albumJedisConnection" factory-method="getDatabase" />
		</constructor-arg>
	</bean>
	......
</beans>
<property name="host" value="${redis.album.host}" />
上文中${redis.album.host}应该引用的是pom.xml中的配置

并且redis.properties:
# Redis settings  
redis.host=${redis.host}
redis.port=${redis.port}
redis.keyword.ip=${redis.keyword.ip}
redis.keyword.port=${redis.keyword.port}
redis.maxIdle=300  
redis.maxActive=600  
redis.maxWait=1000  
redis.testOnBorrow=true

3、使用例子

(1)
@Service("albumRedisInitService")
public class AlbumRedisInitServiceImpl implements AlbumRedisInitService {
	Logger logger = Logger.getLogger(this.getClass());
	@Resource(name = "albumJedisPool")
    private JedisPool jedisPool;
    //一个方法:
	......
	 /**
     * 相册广场的条目
     */
    private void initPublicAlbum() {
        String sql = "select id from album_item where open_type = 1 and del_flag = 0";
        Date staDate = new Date();
        List<Map<String, Object>> list = appUserDao.findBySQL(sql,
            new ArrayList<>());
        Date endDate = new Date();
        System.out.println("find user FocusAlbum cost time :" +
            (endDate.getTime() - staDate.getTime()) + "ms ,total count:" +
            list.size());
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            Pipeline pipeline = jedis.pipelined();//管道(Pipelining)异步方式,一次发送多个指令,不同步等待其返回结果。这样可以取得非常好的执行效率
            int i = 1;
            for (Map<String, Object> map : list) {
                String id = map.get("id").toString();
				//向public_album这个set集合中添加数据
                <span style="background-color: rgb(255, 0, 0);">pipeline.sadd("public_album", id);//向public_album这个set集合中添加数据</span>
                if (i % 10000 == 0) {
                    pipeline.sync();//关闭pipeline
                }
                i++;
            }
            pipeline.sync();//关闭pipeline
            System.out.println("insert initPublicAlbum redis cost: " +
                (new Date().getTime() - endDate.getTime()) + "ms");
        } catch (Exception e) {
            jedisPool.returnBrokenResource(jedis);
            throw e;
        } finally {
            jedisPool.returnResource(jedis);
        }
    }
	......
}

(2)从redis中取数据并转化为vo对象
    /**
     * 返回详细地址
     */
    public String getLocationDesc(int locationId, int startLevel, int endLevel) {
        
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String locationDesc = "";
            String json = jedis.hget("location_detail", locationId + "");
            if (json == null) {
                return null;
            }
            RedisLocationVo vo = JSONObject.toJavaObject(JSONObject.parseObject(json), RedisLocationVo.class);
            if (vo.getLevelType() < startLevel) {
                return vo.getText();
            }
            if (vo.getLevelType() >= startLevel && vo.getLevelType() <= endLevel) {
                locationDesc = vo.getText() + locationDesc;
            }
            
            boolean hasParent = true;
            int id = vo.getPid();
            do {
                String key = "location_parent:" + id;
                Set<String> set = jedis.zrange(key, 0, -1);
                if (set != null && !set.isEmpty()) {
                    hasParent = true;
                    <span style="background-color: rgb(255, 0, 0);">json = jedis.hget(location_detail, id + "");//hash的get:hget</span>
                    <span style="background-color: rgb(255, 0, 0);">vo = JSONObject.toJavaObject(JSONObject.parseObject(json), RedisLocationVo.class);</span>
                    id = vo.getPid();
                    if (vo.getLevelType() >= startLevel && vo.getLevelType() <= endLevel) {
                        locationDesc = vo.getText() + locationDesc;
                    }
                } else {
                    hasParent = false;
                }
            } while (hasParent);
            return locationDesc;
        } catch (Exception e) {
            jedisPool.returnBrokenResource(jedis);
            throw e;
        } finally {
            jedisPool.returnResource(jedis);
        }
        
    }

(3)向redis中保存数据
    @Override
    public void saveWeather() {
        // TODO Auto-generated method stub
        //RedisUtil redis = new RedisUtil();
        // redis.delOject(weatherKey);// 此处不删除缓存,只更新

        // 获取所有市级及内蒙所有县及所有县直辖市
        String hql = "from Location l where l.levelType=3 or ( l.levelType=4 and l.parent.parent.id=14727) or (l.levelType=4 and l.parent.id in(33979,57359,35518,41613) )  order by l.levelType "; // or
                                                                                                                                                                                     // l.levelType=4
        List<Location> list = locationDAO.findByHQL(hql);

        Properties p = new Properties();
        try {
            ClassLoader classLoader = Thread.currentThread()
                .getContextClassLoader();
            InputStream inputStream = classLoader
                .getResourceAsStream("baiduCityWeather.properties");
            p.load(inputStream);
        } catch (Exception ex) {
            log.error("获取百度城市名称异常:" + ex.getMessage());
        }
        String noResult = "";
        // 获取百度天气
        Jedis jedis = null;
        jedis = jedisPool.getResource();
        try {
            for (Location location : list) {
                String field = location.getId().toString();
                String cityName = location.getName();
                // 判断是否需要转换城市名称
                if (p.get(location.getId().toString()) != null) {
                    cityName = (String) p.get(location.getId().toString());
                }
                //
                try {
                    WeatherCacheVo result =  getBaiduWeather(cityName);
                    // 由于百度天气根据名称能获取县级天气,故现在调整为不使用天气网接口,天气网接口也经常获取天气失败
                    // 如果已获取到天气则写入缓存
                    if (result != null) {
                        log.info("已获取到天气:地区名称:" + cityName + ",地区编号:" + field);
                        <span style="background-color: rgb(255, 0, 0);">String strWeather = JSONObject.toJSONString(result);
                        jedis.hset("weather", field, strWeather);</span>

                    } else {
                        log.error("未获取到天气:地区名称:" + location.getParent().getName() + "/" + cityName);
                        noResult = noResult + location.getId() + "/" + location.getParent().getName() + "/" + cityName + "/" + field + ",";
                    }
                } catch (Exception ex) {
                    log.error("获取百度天气异常,地区名称:" + cityName);
                }
            }
        } catch (Exception ex) {
            jedisPool.returnBrokenResource(jedis);
            
        } finally {
            if (jedis != null) {
                jedisPool.returnResource(jedis);
            }
        }
        log.error("未获取到天气的有:" + noResult);
    }



redis学习笔记,随便记记

安装:yum install redis 启动服务:redis-server 连接:redis-cli 常用key value命令 一:字符串 set key value 重复set一个key会替换原...
  • a917390823
  • a917390823
  • 2016年08月29日 14:31
  • 625

Redis学习笔记-进阶

Redis持久化方案 redis有rdb和aof两种持久化方案 1)rdb方式 当符合一定条件时会自动将内存中的所有数据执行快照操作并存储到硬盘上默认存储在redis根目录的dump.r...
  • daboaxiaoyu
  • daboaxiaoyu
  • 2016年09月14日 16:15
  • 96

Redis学习笔记

redis学习笔记,记下方便日后复习和参考
  • xbliu564
  • xbliu564
  • 2017年12月31日 01:06
  • 156

Redis系列学习笔记20 Redis多机特性工作原理简介

Redis多机特性工作原理简介 复制(replication) Sentinel 集群(cluster) 复制SLAVEOFSLAVEOF 将一个服务器(从服务器)变成为另一个服务器(主服务器)的...
  • ECHO_FOLLOW_HEART
  • ECHO_FOLLOW_HEART
  • 2016年05月23日 16:16
  • 769

redis学习笔记(14)---redis基本命令总结

概述 Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合。本文详细介绍这五种数据类型的使用方法。本文命令介绍部分只是列举了基本的命令,至于具体的使用示例,可以参考Redis官方...
  • u012658346
  • u012658346
  • 2016年05月10日 15:11
  • 3211

redis学习笔记

Redis 1、什么是redis a)        什么是nosql b)       Nosql的数据库的种类 c)        Redis是什么类型 d)       Redis的应...
  • kaixinnongchang208
  • kaixinnongchang208
  • 2016年03月09日 10:45
  • 452

【Redis学习笔记(七)】 Redis中的事务

在【Redis学习笔记】前面几篇文章中,我们简单介绍了Redis中的五种数据结构相关的命令,今天,我们来介绍一下Redis中的事务Transaction。一、什么事事务如果你之前接触过MySQL、Or...
  • Xiejingfa
  • Xiejingfa
  • 2016年02月16日 16:31
  • 1494

Chrome学习笔记(三):UI组件,皮肤引擎

原创文章,转载请注明:转载自Soul Apogee 本文链接地址:Chrome学习笔记(三):UI组件,皮肤引擎 —— 控件库 这篇文章是接着上篇文章继续聊的,Chrome的代码实在太多,每一...
  • wanfengnianhua
  • wanfengnianhua
  • 2017年04月25日 18:56
  • 252

Redis系列学习笔记3 散列

散列储存多个域值对。一个散列由多个域值对(field-value pair)组成,散列的域和值都可以是文字、整数、浮点数或者二进制数据。同一个散列里面的每个域必须是独一无二、各不相同的,而域的值则没有...
  • ECHO_FOLLOW_HEART
  • ECHO_FOLLOW_HEART
  • 2016年05月23日 16:02
  • 403

Dubbo框架学习笔记(三)

Dubbo源码地址:https://github.com/alibaba/dubbo Dubbo开发指南:http://dubbo.io/Developer+Guide-zh.htm Dubbo服务...
  • koalacoco
  • koalacoco
  • 2017年04月03日 20:46
  • 217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis学习笔记(三)
举报原因:
原因补充:

(最多只允许输入30个字)