redis 随笔

https://www.cnblogs.com/qizi/p/8427702.html 自动生成 mapper.xml
---------------------------------------------------------------------
redis-cli.exe -h 127.0.0.1 -p 6379 进行redis
set mykey abc
get mykey
------------------------
hmset myhash fieldel "abc" field2 "hello"
hget myhash field2
------------------------
lpush my1 hello
lpush my1 nihao
lpush my1 bybe
lrange my1 0 10
-------------------------
127.0.0.1:6379> sadd my2 red
(integer) 1
127.0.0.1:6379> sadd my2 ageren
(integer) 1
127.0.0.1:6379> sadd my2 blak
(integer) 1
127.0.0.1:6379> smembers my2
1) "ageren"
2) "red"
3) "blak"
-----------------
import redis.clients.jedis.Jedis;
public class RedisJava{
public static void main(String[] args){
Jedis iedis =new Jedis("localhost",6379);
System.out.println("连结成功");
System.out.println(“服务正在运行:"+jedis.ping());
jedis.set("runoobkey",”www.runoob.com“);
sy}}
--------------------------
redis.clients/jedis/2.5.2 Jedis maven依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.5.2</version>
</dependency>
---------------------------------------
list 集合
public static void main(String[] args){
Jedis jedis=new Jedis("127.0.0.1",6379);
jedis.lpush("list","aa");
jedis.lpush("list","bb");
jedis.lpush("list","cc");
List<String>listCache=jedis.lrange("list",0,3);
for(int i=0; i<listCache.size(); i++){
System.out.println("缓存输出"+listCache.get(i));}
}
---------------------------------------
哈希类型
Map<String,String >hashMap=new HashMap<String,String>();
hashMap.put("xiaoming","man");
hashMap.put("xiaohua","women");
hashMap.put("xiaoma","man");
jedis.hmset("test",hashMap);
Map<String,String>hashData=jedis.hgetAll("test");
System.out.print("获得hash缓存数据(xiaoming):"+hashData.get("xiaoming"));
System.out.print("获得hash缓存数据(xiaohua):"+hashData.get("xiaohua"));
输出结果:
[plain] view plain copy
连接成功!
获取hash缓存数据(xiaoming):man
获取hash缓存数据(xiaohua):women
--------------------------------------
Set(无序,不重复集合) 类型实例
jedis.sadd("test1","java");
jedis.sadd("test1","hello");
jedis.sadd("test1","php");
Set<String> setCache=jedis.smembers("test1");
for(String setStr: setCache){
System.out.print("Set集合缓存输出 "+setStr)};
----------------------------------------------------------
ZSet(有序,不重复集合) 类型实例
jedis.zadd("test2",1,"java");
jedis.zadd("test2",3,"c++");
jedis.zadd("test2",2,"php");
jedis.zadd("test2",2,"php");
Set<String> setCache=jedis.zrange("test2",0,5);
for(String setStr: setCache){
System.out.print(setStr);}
获取zset缓存数据Java
获取zset缓存数据PHP
获取zset缓存数据C++
-----------------------------------------------
redis实现秒杀demo
2017年09月09日 18:58:12
阅读数:2109
代码

package com.prosay.redis;

import java.util.List;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class SaleRunable implements Runnable{
String productKey="iphone8";//监视的key 当前秒杀商品的数量
Jedis jedis = new Jedis("localhost");
String userName;
public SaleRunable(String userName){
this.userName = userName;
}

@Override
public void run(){
//商品的key , 秒杀有个数量
//watch 监视一个key,当事务执行之前这个key发生了改变,事务会被打断
jedis.watch(productKey);
String value = jedis.get(productKey);
int num = Integer.valueOf(value);
//这次秒杀的商品是100个iphone8
if(num<=100&&num>=1){
//开启事务
Transaction tx = jedis.multi();
//减少一个商品数量
tx.incrBy(productKey, -1);
//提交事务,如果商品数量发生了改动 则会返回null
List<Object> list = tx.exec();
if(list==null || list.size()==0){
System.out.println(userName+"商品抢购失败!");
}else{
for(Object success : list){
System.out.println(userName+"("+success.toString()+")商品抢购成功,当前抢购成功的人数是:"+(1-(num-100)));
}
}
}else{
System.out.println(userName+"商品已经被抢完了");
}
jedis.close();
}

}

测试

package com.prosay.redis;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import redis.clients.jedis.Jedis;

public class TestMs {

public static void main(String[] args) {
Jedis jedis = new Jedis("localhost");
jedis.set("iphone8","100");
jedis.close();
//玩多线程
ExecutorService executor = Executors.newFixedThreadPool(20);

for(int i = 0 ; i < 1000; i++){
executor.execute(new SaleRunable("user"+i));
}
executor.shutdown();

}

}
-------------------------------------------------------------
java session基于redis共享方案
2017年03月29日 15:25:37
阅读数:5302
session基于redis共享有两种基本的方案
1、基于容器自身的扩展,比如tomcat的session-manage,可以参考如下
地址进行配置https://github.com/jcoleman/tomcat-redis-session-manager
这个方案只适用tomcat容器,而且容器需要配置,这里不具体展开,有需要的可以参考上面的地址进行配置。但是这个方案有一个好处,可以适用于struts2和springmvc的场景,而且对springmvc没有版本要求。

2、基于spring-session的方案,spring-session的好处不仅仅是session共享,它还可以应用于多终端session共享,websocket,restful api等场景。下面具体说明一下
配置。特别说明spring-session是基于springmvc4.0以后的版本的,所以版本不匹配的就不能使用。

mave配置

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.2.RELEASE</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.2.9.RELEASE</version>
</dependency>

xml配置
spring.xml

<bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" >
<property name="maxInactiveIntervalInSeconds" value="1800" />
</bean>

<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="192.168.17.24" />
<property name="port" value="6379" />
</bean>

web.xml

<!-- 分布式Session共享Filter -->
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
----------------------------------------------------------
redis session 共享 session的生成方式是,浏览器通过请求向服务器发送数据,在发送的过程中,浏览器会带着它的请求头去请求,在这个请求头中浏览器会携带cookie和其发送的数据包括一些其他浏览器版本,请求来源等信息。而服务器会根据用户的cookie生成相应的sessoin,并在response中携带返回给浏览器。那么如果我们是跨域访问不动服务器,肯定是对不同的服务器有不同的cookie值,这样服务器就会认为这是一个新的用户在访问。以上的方式就是解决session共享的问题
但是(坑来了):我们在做交互的时候大都是利用ajax在进行,ajax在请求数据的时候,是不会携带请求的cookie的,这样就算你使用了redis也不能实现session共享,我就必须要给ajax加上一条属性来表示让它携带cookie请求xhrFields: {withCredentials: true} 这样就行了。如果ajax中添加了这条属性,又会影响到后台允许跨域的设置。通常我们的跨域设置是response.setHeader("Access-Control-Allow-Origin", "*"); 在有这条属性的时候,浏览器是不会允许通配符*来允许跨域的,所有我们要修改如下跨域方式。
//ori是获取请求头的域名
String ori = request.getHeader("origin");
if(ori != null){
//这个是我读取配置文件的util,在这个配置文件中我写了我的所有允许跨域的域名,并且用逗号分开
String agreeDomain = ReadPropertiesUtil.getPorperties("/config.properties", "serviceDomain");
//拆分遍历这些域名,如果有匹配则直接设置这个域名允许跨域,如果没有就return false了。
String[] agreeDomainArr = agreeDomain.split(",");
for (String string : agreeDomainArr) {
if(ori.equals(string)){
// 接口允许跨域请求
response.setHeader("Access-Control-Allow-Origin", ori);
response.setHeader("Access-Control-Allow-Credentials", "true");
}
}

猜你喜欢

转载自www.cnblogs.com/hqf520/p/9143872.html