要求通过key-value的形式储存和访问数据,但单key太容易出现冲突了,所以要求支持多key。

【试题要求】
保存数据
bus.put(“key1”,”key2” ,value1);
bus.put(“key1”,”key2”,”key3”,value2);
注意每个key下面都可以储存数据

获取数据(key必须按照保存value时候key的顺序)
let value1=bus.get(“key1”,”key2”);
let value2=bus.get(“key1”,”key2”,”key3”);

清理数据
bus.remove(“key1”). //把key1下面的所有节点删除

8个回答

已自行解决,任何评论都没有采纳。

用List实现 List<自定义对象>

自定义对象中两个属性
List keylist; //存多个key

Object value; // 存值

提供可以直接提供构造传值的方法
对象(Object value,String key1,String...keys)key1是保证一定有一个Key,之后的key可以为可变长度,要多少就可以写多少
之后把所有传进来的key全部存进List属性中即可

qq_40634961
qq_40634961 如果需要严谨一些,避免key重复的话对象内部可以使用set存
一年多之前 回复

首先数据结构key - value 这种字典结构 key 是唯一的不能重复 就像字典里的目录你知道了目录可以直接翻到相对应的位置,
所以 按照你的需求这种数据结构是不能满足你的需求,可以搭配list来将进行数据的封装 你的数据多个key 对应一个value? 那么你把value 变为key 对应的值为list即可

多key,key用list;单key不重复用set

用Map>简单封装就可以解决你的问题

如果是我,我首先想到的是这种结构,然后封装起来
map
{
key1:{
default:xxx,
key2:{
default:xxx,
}
},
key1:{
default:xxx,
key2:{
default:xxx,
}
}
}

import java.util.HashMap;
import java.util.Map;

public class LocalCache {

private final String connector = "||";

private final String reg = "\\|\\|";

private Map<String, String> cache = new HashMap<String, String>();;

public void put(String... params){
    if(params == null || params.length < 2){
        return ;
    }

    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < params.length - 1; i++) {
        stringBuffer.append(params[i]).append(connector);
    }

    cache.put(stringBuffer.delete(stringBuffer.length() - 2, stringBuffer.length()).toString(), params[params.length - 1]);
}

public String get(String... keys){
    if(keys == null || keys.length == 0){
        return null;
    }

    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < keys.length; i++) {
        stringBuffer.append(keys[i]).append(connector);
    }

    return cache.get(stringBuffer.delete(stringBuffer.length() - 2, stringBuffer.length()).toString());
}

public void remove(String key){
    for (String cacheKey : cache.keySet()) {
        String[] keyArray = cacheKey.split(reg);
        if(keyArray[0].equals(key)){
            cache.remove(cacheKey);
        }
    }
}
}

弹性k-v最简单的一种原型就是把前面的key都拼成一个单key

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
key-value 的一些简单问题
小弟最近在研究kv存储,遇到了两个问题,现在想请知道的大神给一些解答。 1) key值是通过value值哈希得到的还是随机分配的,亦或是其他途径? 2) kv存储是否应用到一些大的数据存储中,比如存储视频,音频,图片等。若果 应用在这种存储场景下,是不是一个视频就是一个value值,只对应一个key呢?当一个存储单位,比如一整个SSTable还不能容纳一个视频文件,那该视频剩余的部分是怎么处理的?
Key-Value对于大文件的应用
kv存储是否应用到一些大的数据存储中,比如存储视频,音频,图片等。若果 应用在这种存储场景下,是不是一个视频就是一个value值,只对应一个key呢?当一个存储单位,比如一整个SSTable还不能容纳一个视频文件,那该视频剩余的部分是怎么处理的?
如何将String类型的Json样的数据,取出其中key和所对应的value,
![图片说明](https://img-ask.csdn.net/upload/201706/19/1497841802_352755.png) 比如说这样的数据。。list类型的redis里面存储的是Json样式的数据。 后台取到这个redis。然后遍历list。取得每一个string类型的数据。 ![图片说明](https://img-ask.csdn.net/upload/201706/19/1497841983_277816.png) 然后我想对这个取出的String类型的list进行分割,取出每 一个key所对应的value。 这里不太清楚 用什么方法。取值 。求大腿!
怎么将'关系'数据库的数据转换到'非关系'数据库中?
就是E-R转K-V 我对redis不太熟悉,如果是单单的存储为key-value型的数据,应该只涉及到外键的处理吧?
如何在JPEG中添加exif信息,我用的是sanselan
exif信息是key-value形式存储的的,我想新增一个新的exif信息。但网上似乎没有这方面的资料,只能对原有的exif信息进行编辑,无法新增。 哈,望大能们施加援手,不胜感激。
spring boot redis如何多对一存储及查询
举个例子 在spring boot中 我要储存一个通话记录,一个key是发送人,一个key是接收人,一个key是通话时间, value是通话内容,由着3个key共同确定这个value,我该怎么存储 查询
为什么老显示key_value 未定义 ,data数组也有问题??
/*************************************************** 本程序是要用单片机做一个计算器 *************************************************/ #include<reg51.h> #include<math.h> #define GPIO_key P2 #define GPIO_zu P0//位选 #define GPIO_led P1//段选 unsigned char zu[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char LED_data[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; unsigned char LED_num[9]; unsigned char flag; void display_num();//用来显示每次按键之后的key_value void dispay_r(unsigned int r);//用来显示结果 void delayms(unsigned int i);//延时函数 char keypress();//扫描矩阵键盘 int jisuan(); unsigned char data[17];//全局存储数组 存储键值 //MAIN.C(23): error C141: syntax error near '[' unsigned char p;//用于 计算函数 和 出栈显示 的下标 //uchar p_stack;//用于显示数字的下标 void main() { int i; int res; p=-1; unsigned char key_value; //MAIN.C(32): error C141: syntax error near 'unsigned' for(i=0;i<10;i++) { LED_num[i]=LED_data[i]; } flag=0;//标记是否有键值 while(1) { loop: key_value=keypress();//修改flag,输出键值 //MAIN.C(32): error C202: 'key_value': undefined identifier if(flag==1)//当flag=1时,表示有键值输入 { if (p<=17)//入队操作 { p++; data[p]=key_value; } if (key_value>-1&&key_value<10) { display_num();// display each num; } else if (key_value=='=') { res=jisuan(); dispay_r(res); } else goto loop; //判断key_value } flag=0; } } int jisuan() { unsigned int num[2]={0,0}; unsigned char fuhao; int i=0; for (;p>-1;p--) { if (data[p]>-1&&data[p]<10) //MAIN.C(71): error C141: syntax error near 'data' { num[i]=data[p]+num[i]*10; } else { i++; fuhao=data[p]; } } switch(fuhao) { case '+':num[1]=num[0]+num[1];break; case '-':num[1]=num[0]-num[1];break; case '*':num[1]=num[0]*num[1];break; case '/':num[1]=num[0]/num[1];break; } return num[1]; } char keypress() { unsigned char temp,key; GPIO_key=0xfe; temp=temp&0xf0; if (temp!=0xf0) { delayms(10); temp=GPIO_key; if (temp!=0xf0) { flag=1; temp=GPIO_key; switch(temp) { case 0xee:key=0;break; case 0xde:key=1;break; case 0xbe:key=2;break; case 0x7e:key=3;break; } while(temp!=0xf0) { temp=GPIO_key; temp=temp&0xf0; } } } GPIO_key=0xfd; temp=temp&0xf0; if (temp!=0xf0) { delayms(10); temp=GPIO_key; if (temp!=0xf0) { flag=1; temp=GPIO_key; switch(temp) { case 0xed:key=4;break; case 0xdd:key=5;break; case 0xbd:key=6;break; case 0x7d:key=7;break; } while(temp!=0xf0) { temp=GPIO_key; temp=temp&0xf0; } } } GPIO_key=0xfb; temp=temp&0xf0; if (temp!=0xf0) { delayms(10); temp=GPIO_key; if (temp!=0xf0) { flag=1; temp=GPIO_key; switch(temp) { case 0xeb:key=8;break; case 0xdb:key=9;break; case 0xbb:key='+';break; case 0x7b:key='-';break; } while(temp!=0xf0) { temp=GPIO_key; temp=temp&0xf0; } } } GPIO_key=0xf7; temp=temp&0xf0; if (temp!=0xf0) { delayms(10); temp=GPIO_key; if (temp!=0xf0) { flag=1; temp=GPIO_key; switch(temp) { case 0xe7:key='*';break; case 0xd7:key='/';break; case 0xb7:key='=';break; case 0x77:key='.';break; } while(temp!=0xf0) { temp=GPIO_key; temp=temp&0xf0; } } } return key; } void display_num() { int zhi=p; int j=0; while(j>-1) { if (data[zhi]>-1&&data[zhi]<10) { GPIO_zu=zu[j]; GPIO_led=LED_num[data[zhi]]; zhi--; j++; } } } void dispay_r(unsigned int r) { unsigned char temp_r[8]; int i; for(i=0;i<8;i++) { temp_r[i]=(int)r%(int)pow(10,i+1); } for (i=0;i<8;i++) { GPIO_zu=zu[i]; GPIO_led=LED_num[temp_r[i]]; } } void delayms(unsigned int i) { unsigned char c; for(;i>0;i--) { for(c=110;c>0;c--); } }
IOS如何将复杂的json数据存储在沙盒中
从服务器获取到的json数据比较大,一般在200kb到800k之间,json中包含了几十对key-value,而且有很多数组、对象嵌套,请问我该用哪种方案把这个json缓存到本地比较好。注意,这个json不是固定的,用户可以手动刷新,根据json中的时间标记获取最新的json。加载更多也要获取一个这样的json,但这个不用缓存在本地,只保留最新的一个json数据。 有过相关经验的朋友们来说说你们的解决方案,Android的方案也可以来讲讲,借鉴一下。 PS:真想给做服务器的那帮家伙一人一个耳光!!
android中Bundle与Map的区别是什么
android中Bundle与Map的区别是什么 相同点都是以key—value形式储存数据
java HashMap存储list集合的问题
我定义一个全局的list集合,然后存储不同的数据,根据不同的Key存放在Map中,但是获取的时候确发现通过不同的Key拿到的Value却是同一个list集合,请问怎么办?
存储在sharedPreference文件中的数据在退出应用后丢失
//以下为工具类代码,用于保存设置项,在应用内数据均可正常使用,退出应用再进去后设置项数据全取了默认值,求助问题出在哪里 public class SpUtil { private static SharedPreferences sp; public static void putBoolean(Context ctx,String key,boolean value){ if (sp==null){ sp=ctx.getSharedPreferences("config",Context.MODE_PRIVATE); } sp.edit().putBoolean(key,value).commit(); } public static boolean getBoolean(Context ctx,String key,boolean defValue){ if (sp==null){ sp=ctx.getSharedPreferences("config",Context.MODE_PRIVATE); } return sp.getBoolean(key,defValue); } public static void putString(Context ctx,String key,String value){ if (sp==null){ sp=ctx.getSharedPreferences("config",Context.MODE_PRIVATE); } sp.edit().putString(key, value).commit(); } public static String getString(Context ctx,String key,String defValue){ if (sp==null){ sp=ctx.getSharedPreferences("config",Context.MODE_PRIVATE); } return sp.getString(key, defValue); } public static void remove(Context ctx, String key) { if (sp==null){ sp=ctx.getSharedPreferences("config",Context.MODE_PRIVATE); } sp.edit().remove(key).commit(); } }
怎么实现jsp表单数据多次添加存储到session对象
如题,1、有一种HashMap的数据结构,key包含明星姓名 value是一个String的数组,包含了国籍、性别、年龄、粉丝数目、最拿手的歌、拍的最好的电影这些字符串数据。 2、编写addStar.jsp,可以通过表单增加一个明星的上述字段。点击提交按钮后,跳转到一个servlet程序中。 3、该servlet程序首先读取前一个页面表单的内容,并把信息存储在第一步的HashMap里,再将该对象存储在session作用域的属性内。然后跳转到browseStar.jsp页面 4、browseStar.jsp:该页面以表格的方式输出存储在session作用域内的各个明星信息。要求有标题行,显示数据的奇偶行颜色要有差异。 标题行内容包括:序号 明星姓名 国籍 性别 年龄 粉丝数目 最拿手的歌 拍的最好的电影 5、考虑,如果通过addStar.jsp实现多次添加明星数据的功能,程序要进行什么修改? 我实现了前面4步,第5步该怎么实现?
安卓调用百度地图sdk,可是返回坐标值一直是4.9E-324
我发现手机端使用正常,就是在使用夜神模拟器的时候出现的这样的问题。 打开夜神模拟器设置,发现我的软件有这个位置权限(手机端申请了动态权限) 但就是返回4.9E-324,location.getLocType()的返回值是167.我看文档说是没有获取到位置权限。 我现在就有一点迷惑了,动态的也申请了,也在AndroidManifest里面写了权限。 真心不知道这个bug咋解决。 以下是我mainactivity里面所有的代码: ``` package com.example.ppgo; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import java.util.ArrayList; import java.util.List; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; public class MainActivity extends AppCompatActivity { public LocationClient mLocationClient; private TextView positionText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLocationClient=new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(new MyLocationListener()); setContentView(R.layout.activity_main); positionText=(TextView)findViewById(R.id.position_text_view); List<String> permissionList=new ArrayList<>(); if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.READ_PHONE_STATE)!=PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.READ_PHONE_STATE); } if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest. permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if(!permissionList.isEmpty()){ String[]permissions=permissionList.toArray(new String[permissionList.size()]); ActivityCompat.requestPermissions(MainActivity.this,permissions,1); }else { requestLocation(); } } private void requestLocation(){ initLocation(); mLocationClient.start(); } private void initLocation(){ LocationClientOption option =new LocationClientOption(); option.setScanSpan(5000); mLocationClient.setLocOption(option); } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stop(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); Log.e("Tag","执行了onRequestPermissionsResult函数"); switch (requestCode){ case 1: if (grantResults.length>0){ for(int result:grantResults){ if(result!=PackageManager.PERMISSION_GRANTED){ Toast.makeText(this,"必须同意所有权限才能使用本程序", Toast.LENGTH_SHORT).show(); finish(); return; } } requestLocation(); }else { Toast.makeText(this,"发生未知错误",Toast.LENGTH_SHORT).show(); finish(); } break; default: } } public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location){ StringBuilder currentPosition=new StringBuilder(); currentPosition.append("纬度:").append(location.getLatitude()).append("\n"); currentPosition.append("经线:").append(location.getLongitude()).append("\n"); currentPosition.append("国家:").append(location.getCountry()).append("\n"); currentPosition.append("省:").append(location.getProvince()).append("\n"); currentPosition.append("市:").append(location.getCity()).append("\n"); currentPosition.append("区:").append(location.getDistrict()).append("\n"); currentPosition.append("街道:").append(location.getStreet()).append("\n"); currentPosition.append("定位方式:"); if (location.getLocType() == BDLocation.TypeGpsLocation) { currentPosition.append("GPS"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) { currentPosition.append("网络"); currentPosition.append(" 错误代码:"+location.getLocType()); } else if (location.getLocType() == BDLocation.TypeOffLineLocation){ currentPosition.append("离线定位成功,离线定位结果也是有效的"); } else if (location.getLocType() == BDLocation.TypeServerError){ currentPosition.append("服务端网络定位失败"); currentPosition.append(" 错误代码:"+location.getLocType()); } else if (location.getLocType() == BDLocation.TypeNetWorkException){ currentPosition.append("网络不同导致定位失败,请检查网络是否通畅"); } else if (location.getLocType() == BDLocation.TypeCriteriaException){ currentPosition.append("无法获取有效定位依据导致定位失败"); currentPosition.append(" 错误代码:"+location.getLocType()); } else { currentPosition.append(location.getLocType()); //这里打印出来location.getLocType()是162 currentPosition.append("老子也不知道是啥原因!!!"); } positionText.setText(currentPosition); } } } ``` 以下是我AndroidManifest里面的代码: ``` <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.ppgo"> <!-- 这个权限用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="mvxMsdG1homIlK4UjAWYP2itjxo09Dyy" /> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" /> </application> </manifest> ```
shiro session使用redis存储
场景:使用redis存储shiro的session 当根据sessionId从redis中获取session对象时应返回null ``` try { if (null != sessionId) { byte[] bytes = robertRedisClient.get(redisSerializer.serialize(SHIRO_SESSION + sessionId.toString())); if (1 > bytes.length) { return null; } return (Session) redisSerializer.deserialize(bytes); } return null; } catch (Exception e) { log.error("获取shiro的session时发生异常,异常详细信息:\n {}", ExceptionUtils.getStackTrace(e)); return null; } ``` 问题:1、后台日志上可以看到nullpointexception,可也有新session创建的日志输出 ``` 2019-05-06 16:41:46.583 [XNIO-1 task-6] ERROR- com.robert.auth.session.RedisSessionDao - 获取shiro的session时发生异常,异常详细信息: java.lang.NullPointerException at com.robert.auth.session.RedisSessionDao.doReadSession(RedisSessionDao.java:54) at org.apache.shiro.session.mgt.eis.AbstractSessionDAO.readSession(AbstractSessionDAO.java:168) 2019-05-06 16:41:46.583 [XNIO-1 task-6] DEBUG- com.robert.auth.session.RedisSessionDao - 新增一个session:3dfe4f26-ddb2-4b1e-9fc0-fa772cd60dd8 2019-05-06 16:41:46.583 [XNIO-1 task-6] DEBUG- com.robert.auth.session.RedisSessionDao - 创建session的host:192.168.0.221,session主键:3dfe4f26-ddb2-4b1e-9fc0-fa772cd60dd8,最后访问时间:Mon May 06 16:41:46 CST 2019 2019-05-06 16:41:46.584 [XNIO-1 task-6] DEBUG- com.robert.auth.redis.RobertRedisClient - 向redis中写数据:key-shiro-session:3dfe4f26-ddb2-4b1e-9fc0-fa772cd60dd8,value-...,timeout-1800 2019-05-06 16:41:46.585 [XNIO-1 task-6] DEBUG- com.robert.auth.session.RedisSessionDao - 更新shiro session :3dfe4f26-ddb2-4b1e-9fc0-fa772cd60dd8 2019-05-06 16:41:46.585 [XNIO-1 task-6] DEBUG- com.robert.auth.session.RedisSessionDao - 创建session的host:192.168.0.221,session主键:3dfe4f26-ddb2-4b1e-9fc0-fa772cd60dd8,最后访问时间:Mon May 06 16:41:46 CST 2019 2019-05-06 16:41:46.585 [XNIO-1 task-6] DEBUG- com.robert.auth.redis.RobertRedisClient - 向redis中写数据:key-shiro-session:3dfe4f26-ddb2-4b1e-9fc0-fa772cd60dd8,value-...,timeout-1800 ``` 2、客户端获取不到请求响应
关于Hibernate级联数据表的存储问题(多对一)
本问题来自Struts2.1权威指南一书第19章例19.4问题,是一个关于Hibernate关联数据表存储的问题。 整个例子的目标就是建立一个WEB应用,在一个input.jsp页面上输入父亲和儿子信息,点击提交按钮,将这两个持久化对象的信息写入数据库中的两个数据表中,两个数据表分别是person(代表父亲)和son(代表儿子)。他们的关系是1(person)对N(son) 我在调试这个例程的时候遇到一个问题,就是在向数据库中写入持久化对象时出现错误提示如下: [color=blue]Caused by: java.sql.SQLException: Unknown column 'person_id' in 'field list'[/color] [b][color=red]经过检查具体出问题的语句是在PersonServiceImpl.java代码中的sd.save(s, son)这句(大约第在25行,就是向数据库中写入Son对象的那句)。这里说明一下sd是Son的DAO组件,具体的PersonServiceImpl.java代码见后面。 因为如果将这句注释掉,运行程序,程序可以走通,发现person表中person_id列是可以写入的。此时只是son表中没有写入任何数据。[/color][/b] 于是我检查了Person.hbm.xml、Son.hbm.xml文件,实在没有发现什么可疑之处,现将相关配置文件可能出现问题的关键部位贴出如下: --------------------PersonServiceImpl.java代码------ [code="java"] public class PersonServiceImpl implements PersonService { public void createPersonAndSon(String name , String gender , String[] sonName , int[] sonAge)throws PersonException { try { //业务逻辑组件依赖于DAO组件,从组件工厂中取出两个DAO组件 PersonDao pd = (PersonDao)ComponentFactory.instance().getComponent("personDao"); SonDao sd = (SonDao)ComponentFactory.instance().getComponent("sonDao"); //获取Hibernate Session Session s = HibernateUtil.sf.getCurrentSession(); Transaction tx = s.beginTransaction(); //以面向对象方式开始持久化操作 Person p = new Person(); p.setName(name); p.setGender(gender); pd.save(s , p); //增加Person实体关联的Son实体 for (int i = 0 ; i < sonName.length ; i++ ) { Son son = new Son(sonName[i] , sonAge[i]); son.setParent(p); sd.save(s, son);//就是这句出错了,如果注释掉这句,程序依然可以运行,只是son对象不写入数据库而已!!! } //提交事务 tx.commit(); } catch (Exception e) { e.printStackTrace(); throw new PersonException("业务异常"); } } } [/code] ---------------------Son.hbm.xml片段---------------------------------- [code="xml"] <!-- 每个class元素映射一个持久化类 --> <class name="Son" table="son"> <id name="id" column="son_id" unsaved-value="null"> <generator class="identity"/> </id> <property name="sonName" type="string"/> <property name="sonAge" type="int"/> <!-- 映射N:1关联实体 --> <many-to-one name="parent" column="person_id" class="Person" cascade="all" not-null="true"/> </class> [/code] ---------------------Person.hbm.xml片段---------------------------------- [code="xml"] <!-- 每个class元素映射一个持久化类 --> <class name="Person" table="person"> <id name="id" column="person_id" unsaved-value="null"> <generator class="identity"/> </id> <property name="name" type="string"/> <property name="gender" type="string"/> <!-- 映射1:N关联实体 --> <set name="sons" inverse="true"> <key column="person_id"/> <one-to-many class="Son"/> </set> </class> [/code] -----------------------创建数据库及表所使用的SQL语句---------------------- [code="sql"] DROP database if exists struts2hibernate; CREATE database struts2hibernate; use struts2hibernate; CREATE TABLE person(person_id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), gender VARCHAR(50)); CREATE TABLE son(son_id INT AUTO_INCREMENT PRIMARY KEY, sonName VARCHAR(50), sonAge INT); [/code] 别的文件就是光盘中提供的,基本没有修改。目前由于已经能够登录到数据库,并且可以修改部分数据内容,因此关于数据库连接方面配置应该没有问题,但是实在是不知道问题出在哪里了。请不吝赐教!不胜感激!
CCF 推荐系统问题,不知道为什么0分.
CCF 推荐系统问题 源代码如下 ``` from heapq import * MAXINT = 30001 MAX = 51 def opt1_add(product, category, community, score): product[category].append((score, MAXINT - community)) def opt2_delete(product, category, community): for value in range(len(product[category])): if product[category][value][1] == MAXINT - community: product[category].pop(value) break # 数据存储格式为类名+分数,分数中存储响应的序号 def opt3_select(product, opt, m): global MAX global MAXINT constraint = opt[2:].copy() num = opt[1] result = [] for i in range(len(constraint)): temp = nlargest(constraint[i], product[i]) for key in temp: result.append((MAX - i, 30001 - key[1])) temp = {} for key in nlargest(num, result): try: temp[MAX - key[0]].append(key[1]) except KeyError: temp[MAX - key[0]] = [] temp[MAX - key[0]].append(key[1]) keys = list(product.keys()) keys.sort() for key in keys: try: temp2 = temp[key].copy() except: print(-1) continue temp2.sort() for i in range(len(temp2) - 1): print(temp2[i], end=" ") try: print(temp2[len(temp2) - 1]) except IndexError: pass temp = list(input().split()) m = int(temp[0]) n = int(temp[1]) product = {} for i in range(1, n + 1): temp = input().split() for j in range(m): try: product[j].append((int(temp[1]), MAXINT - int(temp[0]))) except KeyError: product[j] = [] product[j].append((int(temp[1]), MAXINT - int(temp[0]))) num = int(input()) for i in range(num): opt = list(input().split()) for j in range(len(opt)): opt[j] = int(opt[j]) if opt[0] == 1: opt1_add(product, opt[1], opt[2], opt[3]) if opt[0] == 2: opt2_delete(product, opt[1], opt[2]) if opt[0] == 3: # print(product) opt3_select(product, opt, m) ``` 答案与测试用例相同但是一直报错误,0分,求问什么wen'ti
vb.net做redis接口 TCPclient连接发送接收数据如何扩大容量 stream的读写缓存如何扩大
如果调用get key或set key数据过大会报错,只能接收小数据的get和set 而redis存储字符串最大能有512M,这个接口我不知道怎么扩大数据发送和接收的上限 Imports System.Drawing Imports System.IO Imports System.Net Imports System.Net.Sockets Imports System.Text Imports vRedis.Commands Public Class RedisClient     Private client As TcpClient     Private stream As NetworkStream     Private reply As RedisReply     Private command As IRedisCommand     Private memStream As MemoryStream     Public ReadOnly Property Host As String     Public ReadOnly Property Port As Integer     Public ReadOnly Property [Return] As Object         Get             Return reply.Value         End Get     End Property     Public Sub New(Optional host As String = "127.0.0.1", Optional port As Integer = 6379)         If IsNothing(host) Then             Throw New ArgumentNullException(NameOf(host))         End If         Me.Host = host         Me.Port = port         client = New TcpClient() _**        Try             client.Connect(host, port)             'TCPclient连接发送接收数据如何扩大容量             stream = client.GetStream()         Catch ex As Exception             Throw New RedisException("An existing connection was forcibly closed by remote host.")         End Try**_     End Sub     Public Sub Quit()         command = New QuitCommand()         Execute(command)     End Sub     Public Sub Append(key As String, value As String)         command = New AppendCommand() With {.Key = key, .Value = value}         Execute(command)     End Sub     Public Sub Del(ParamArray keys() As String)         command = New DelCommand() With {.Keys = keys}         Execute(command)     End Sub     Public Function Dump(key As String) As Byte()         command = New DumpCommand() With {.Key = key}         Execute(command)         If IsNothing(reply.Value) Then             Return Nothing         Else             Return Encoding.UTF8.GetBytes(reply.Value)         End If     End Function     Public Sub Echo(message As String)         command = New EchoCommand() With {.Message = message}         Execute(command)     End Sub     Public Function Exists(key As String) As Boolean         command = New ExistsCommand() With {.Key = key}         Execute(command)         Return reply.Value     End Function     Public Sub Expire(key As String, timeout As Integer)         command = New ExpireCommand() With {.Key = key, .Timeout = timeout}         Execute(command)     End Sub     Public Sub ExpireAt(key As String, ttl As DateTime)         command = New ExpireAtCommand() With {.Key = key, .TTL = (ttl - #1/1/1970#).TotalSeconds}         Execute(command)     End Sub     Public Function [Get](key As String) As String         command = New GetCommand() With {.Key = key}         Execute(command)         Return reply.Value     End Function     Public Sub PExpire(key As String, timeout As Integer)         command = New PExpireCommand() With {.Key = key, .Timeout = timeout}         Execute(command)     End Sub     Public Sub PExpireAt(key As String, ttl As DateTime)         command = New PExpireAtCommand() With {.Key = key, .TTL = (ttl - #1/1/1970#).TotalMilliseconds}         Execute(command)     End Sub     Public Sub Ping()         command = New PingCommand()         Execute(command)     End Sub     Public Sub Auth(password As String)         command = New AuthCommand() With {.Password = password}         Execute(command)     End Sub     Public Sub [Select](index As String)         command = New SelectCommand() With {.Index = index}         Execute(command)     End Sub     Public Sub [Set](key As String, value As String, Optional expireTime As TimeSpan? = Nothing, Optional override As Boolean? = Nothing)         command = New SetCommand() With {.Key = key, .Value = value, .ExpireTime = expireTime, .Override = override}         Execute(command)     End Sub     Public Function Time() As Date         command = New TimeCommand()         Execute(command)         'Return #1/1/1970#.AddSeconds(reply.Value(0)).ToLocalTime()     End Function     Private Sub Execute(command As IRedisCommand)         Dim bytes() As Byte = Encoding.UTF8.GetBytes(command.GetCommand() & vbCrLf)         Try **_            stream.Write(bytes, 0, bytes.Length)             stream.Flush()             'ReDim bytes(65535)             '这里stream的读写缓存如何扩大             ReDim bytes(client.ReceiveBufferSize)             stream.Read(bytes, 0, bytes.Length)**_             Dim result = Encoding.UTF8.GetString(bytes)             Select Case result(0)                 Case "$"                     Dim length = Convert.ToInt32(result.Substring(1, result.IndexOf(vbCrLf) - 1))                     If length = -1 Then                         reply = New RedisReply(RESPType.BulkString, Nothing)                     Else                         reply = New RedisReply(RESPType.BulkString, result.Substring(result.IndexOf(vbCrLf) + 2, length))                     End If                 Case "+"                     reply = New RedisReply(RESPType.SimpleString, result.Substring(1, result.IndexOf(vbCrLf) - 1))                 Case ":"                     reply = New RedisReply(RESPType.Integer, Convert.ToInt32(result.Substring(1, result.IndexOf(vbCrLf) - 1)))                 Case "-"                     reply = New RedisReply(RESPType.Error, result.Substring(1, result.IndexOf(vbCrLf) - 1))                     Throw New RedisException(reply.Value)                 Case "*"                     Dim count = Convert.ToInt32(result.Substring(1, result.IndexOf(vbCrLf) - 1))                     Dim items = result.Split(New Char() {vbCrLf, vbLf}, StringSplitOptions.RemoveEmptyEntries).ToList()                     items.RemoveAt(0)                     items.RemoveAll(Function(i) i.StartsWith("$"))                     items.RemoveAt(items.Count - 1)                     'reply = New RedisReply(RESPType.Array, items)             End Select         Catch ex As Exception             Throw New RedisException($"There is an internal error during executing '{command.GetCommand()}'.")         End Try     End Sub End Class
spring boot整合redis获取异常或者获取不到
系统异常:org.springframework.data.redis.RedisConnec tionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool 刚启动系统运行正常,过几天就会出现这个异常,以下是关于redise的配置: # redis.properties文件中的内容如下: redis.hostName=127.0.0.1 redis.password= #端口号 redis.port=6379 #客户端超时时间单位是毫秒 默认是2000 redis.timeout=10000 #最大空闲数 redis.maxIdle=300 #连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal #redis.maxActive=600 #控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性 redis.maxTotal=300 #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。 redis.maxWaitMillis=1000 #连接的最小空闲时间 默认1800000毫秒(30分钟) redis.minEvictableIdleTimeMillis=300000 #每次释放连接的最大数目,默认3 redis.numTestsPerEvictionRun=1024 #逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 redis.timeBetweenEvictionRunsMillis=30000 #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 redis.testOnBorrow=true #在空闲时检查有效性, 默认false redis.testWhileIdle=true # pom.xml中整合redis内容如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> # redisConfig内容如下: package com.brons.trans.redis; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.JedisPoolConfig; @Configuration @PropertySource("classpath:redis.properties") public class RedisConfig { Logger logger = LoggerFactory.getLogger(RedisConfig.class); @Value("${redis.hostName}") private String hostName; @Value("${redis.port}") private Integer port; @Value("${redis.password}") private String password; @Value("${redis.timeout}") private Integer timeout; @Value("${redis.maxIdle}") private Integer maxIdle; @Value("${redis.maxTotal}") private Integer maxTotal; @Value("${redis.maxWaitMillis}") private Integer maxWaitMillis; @Value("${redis.minEvictableIdleTimeMillis}") private Integer minEvictableIdleTimeMillis; @Value("${redis.numTestsPerEvictionRun}") private Integer numTestsPerEvictionRun; @Value("${redis.timeBetweenEvictionRunsMillis}") private long timeBetweenEvictionRunsMillis; @Value("${redis.testOnBorrow}") private boolean testOnBorrow; @Value("${redis.testWhileIdle}") private boolean testWhileIdle; // @Value("${spring.redis.cluster.nodes}") // private String clusterNodes; // // @Value("${spring.redis.cluster.max-redirects}") // private Integer mmaxRedirectsac; /** * JedisPoolConfig 连接池 * * @return */ @Bean public JedisPoolConfig jedisPoolConfig() { logger.info("初始化RedisConfig.JedisPoolConfig 连接池===="); JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 最大空闲数 jedisPoolConfig.setMaxIdle(maxIdle); // 连接池的最大数据库连接数 jedisPoolConfig.setMaxTotal(maxTotal); // 最大建立连接等待时间 jedisPoolConfig.setMaxWaitMillis(maxWaitMillis); // 逐出连接的最小空闲时间 默认1800000毫秒(30分钟) jedisPoolConfig.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); // 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3 jedisPoolConfig.setNumTestsPerEvictionRun(numTestsPerEvictionRun); // 逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1 jedisPoolConfig.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); // 是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 jedisPoolConfig.setTestOnBorrow(testOnBorrow); // 在空闲时检查有效性, 默认false jedisPoolConfig.setTestWhileIdle(testWhileIdle); return jedisPoolConfig; } /** * 单机版配置 @Title: JedisConnectionFactory @param @param * jedisPoolConfig @param @return @return JedisConnectionFactory @autor * lpl @date 2018年2月24日 @throws */ @Bean public JedisConnectionFactory JedisConnectionFactory(JedisPoolConfig jedisPoolConfig) { logger.info("初始化RedisConfig.JedisConnectionFactory单机版配置===="); JedisConnectionFactory JedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig); // 连接池 JedisConnectionFactory.setPoolConfig(jedisPoolConfig); // IP地址 JedisConnectionFactory.setHostName(hostName); // 端口号 JedisConnectionFactory.setPort(port); // 如果Redis设置有密码 JedisConnectionFactory.setPassword(password); // 客户端超时时间单位是毫秒 JedisConnectionFactory.setTimeout(timeout); return JedisConnectionFactory; } /** * 实例化 RedisTemplate 对象 * * @return */ @Bean public RedisTemplate<String, Object> functionDomainRedisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); initDomainRedisTemplate(redisTemplate, redisConnectionFactory); return redisTemplate; } /** * 设置数据存入 redis 的序列化方式,并开启事务 * * @param redisTemplate * @param factory */ private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) { // 如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to // String! redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); // 开启事务 redisTemplate.setEnableTransactionSupport(true); redisTemplate.setConnectionFactory(factory); } /** * 注入封装RedisTemplate @Title: redisUtil @return RedisUtil @autor lpl @date * 2017年12月21日 @throws */ @Bean(name = "redisUtil") public RedisUtil redisUtil(RedisTemplate<String, Object> redisTemplate) { RedisUtil redisUtil = new RedisUtil(); redisUtil.setRedisTemplate(redisTemplate); return redisUtil; } } # RedisUtil工具类文件内容如下: package com.brons.trans.redis; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.util.CollectionUtils; public class RedisUtil { private RedisTemplate<String, Object> redisTemplate; public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } //=============================common============================ /** * 指定缓存失效时间 * @param key 键 * @param time 时间(秒) * @return */ public boolean expire(String key,long time){ try { if(time>0){ redisTemplate.expire(key, time, TimeUnit.SECONDS); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根据key 获取过期时间 * @param key 键 不能为null * @return 时间(秒) 返回0代表为永久有效 */ public long getExpire(String key){ return redisTemplate.getExpire(key,TimeUnit.SECONDS); } /** * 判断key是否存在 * @param key 键 * @return true 存在 false不存在 */ public boolean hasKey(String key){ try { return redisTemplate.hasKey(key); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 删除缓存 * @param key 可以传一个值 或多个 */ @SuppressWarnings("unchecked") public void del(String ... key){ if(key!=null&&key.length>0){ if(key.length==1){ redisTemplate.delete(key[0]); }else{ redisTemplate.delete(CollectionUtils.arrayToList(key)); } } } //============================String============================= /** * 普通缓存获取 * @param key 键 * @return 值 */ public Object get(String key){ return key==null?null:redisTemplate.opsForValue().get(key); } /** * 普通缓存放入 * @param key 键 * @param value 值 * @return true成功 false失败 */ public boolean set(String key,Object value) { try { redisTemplate.opsForValue().set(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 普通缓存放入并设置时间 * @param key 键 * @param value 值 * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 * @return true成功 false 失败 */ public boolean set(String key,Object value,long time){ try { if(time>0){ redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); }else{ set(key, value); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 递增 * @param key 键 * @param by 要增加几(大于0) * @return */ public long incr(String key, long delta){ if(delta<0){ throw new RuntimeException("递增因子必须大于0"); } return redisTemplate.opsForValue().increment(key, delta); } /** * 递减 * @param key 键 * @param by 要减少几(小于0) * @return */ public long decr(String key, long delta){ if(delta<0){ throw new RuntimeException("递减因子必须大于0"); } return redisTemplate.opsForValue().increment(key, -delta); } //================================Map================================= /** * HashGet * @param key 键 不能为null * @param item 项 不能为null * @return 值 */ public Object hget(String key,String item){ return redisTemplate.opsForHash().get(key, item); } /** * 获取hashKey对应的所有键值 * @param key 键 * @return 对应的多个键值 */ public Map<Object,Object> hmget(String key){ return redisTemplate.opsForHash().entries(key); } /** * HashSet * @param key 键 * @param map 对应多个键值 * @return true 成功 false 失败 */ public boolean hmset(String key, Map<String,Object> map){ try { redisTemplate.opsForHash().putAll(key, map); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * HashSet 并设置时间 * @param key 键 * @param map 对应多个键值 * @param time 时间(秒) * @return true成功 false失败 */ public boolean hmset(String key, Map<String,Object> map, long time){ try { redisTemplate.opsForHash().putAll(key, map); if(time>0){ expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 向一张hash表中放入数据,如果不存在将创建 * @param key 键 * @param item 项 * @param value 值 * @return true 成功 false失败 */ public boolean hset(String key,String item,Object value) { try { redisTemplate.opsForHash().put(key, item, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 向一张hash表中放入数据,如果不存在将创建 * @param key 键 * @param item 项 * @param value 值 * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 * @return true 成功 false失败 */ public boolean hset(String key,String item,Object value,long time) { try { redisTemplate.opsForHash().put(key, item, value); if(time>0){ expire(key, time); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 删除hash表中的值 * @param key 键 不能为null * @param item 项 可以使多个 不能为null */ public void hdel(String key, Object... item){ redisTemplate.opsForHash().delete(key,item); } /** * 判断hash表中是否有该项的值 * @param key 键 不能为null * @param item 项 不能为null * @return true 存在 false不存在 */ public boolean hHasKey(String key, String item){ return redisTemplate.opsForHash().hasKey(key, item); } /** * hash递增 如果不存在,就会创建一个 并把新增后的值返回 * @param key 键 * @param item 项 * @param by 要增加几(大于0) * @return */ public double hincr(String key, String item,double by){ return redisTemplate.opsForHash().increment(key, item, by); } /** * hash递减 * @param key 键 * @param item 项 * @param by 要减少记(小于0) * @return */ public double hdecr(String key, String item,double by){ return redisTemplate.opsForHash().increment(key, item,-by); } //============================set============================= /** * 根据key获取Set中的所有值 * @param key 键 * @return */ public Set<Object> sGet(String key){ try { return redisTemplate.opsForSet().members(key); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 根据value从一个set中查询,是否存在 * @param key 键 * @param value 值 * @return true 存在 false不存在 */ public boolean sHasKey(String key,Object value){ try { return redisTemplate.opsForSet().isMember(key, value); } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将数据放入set缓存 * @param key 键 * @param values 值 可以是多个 * @return 成功个数 */ public long sSet(String key, Object...values) { try { return redisTemplate.opsForSet().add(key, values); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 将set数据放入缓存 * @param key 键 * @param time 时间(秒) * @param values 值 可以是多个 * @return 成功个数 */ public long sSetAndTime(String key,long time,Object...values) { try { Long count = redisTemplate.opsForSet().add(key, values); if(time>0) expire(key, time); return count; } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 获取set缓存的长度 * @param key 键 * @return */ public long sGetSetSize(String key){ try { return redisTemplate.opsForSet().size(key); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 移除值为value的 * @param key 键 * @param values 值 可以是多个 * @return 移除的个数 */ public long setRemove(String key, Object ...values) { try { Long count = redisTemplate.opsForSet().remove(key, values); return count; } catch (Exception e) { e.printStackTrace(); return 0; } } //===============================list================================= /** * 获取list缓存的内容 * @param key 键 * @param start 开始 * @param end 结束 0 到 -1代表所有值 * @return */ public List<Object> lGet(String key,long start, long end){ try { return redisTemplate.opsForList().range(key, start, end); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 获取list缓存的长度 * @param key 键 * @return */ public long lGetListSize(String key){ try { return redisTemplate.opsForList().size(key); } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 通过索引 获取list中的值 * @param key 键 * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 * @return */ public Object lGetIndex(String key,long index){ try { return redisTemplate.opsForList().index(key, index); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, Object value) { try { redisTemplate.opsForList().rightPush(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, Object value, long time) { try { redisTemplate.opsForList().rightPush(key, value); if (time > 0) expire(key, time); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, List<Object> value) { try { redisTemplate.opsForList().rightPushAll(key, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 将list放入缓存 * @param key 键 * @param value 值 * @param time 时间(秒) * @return */ public boolean lSet(String key, List<Object> value, long time) { try { redisTemplate.opsForList().rightPushAll(key, value); if (time > 0) expire(key, time); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 根据索引修改list中的某条数据 * @param key 键 * @param index 索引 * @param value 值 * @return */ public boolean lUpdateIndex(String key, long index,Object value) { try { redisTemplate.opsForList().set(key, index, value); return true; } catch (Exception e) { e.printStackTrace(); return false; } } /** * 移除N个值为value * @param key 键 * @param count 移除多少个 * @param value 值 * @return 移除的个数 */ public long lRemove(String key,long count,Object value) { try { Long remove = redisTemplate.opsForList().remove(key, count, value); return remove; } catch (Exception e) { e.printStackTrace(); return 0; } } }
hashmap 中的Entry链问题
引用网上的一段话:[quote]当程序试图将一个key-value对放入HashMap中时,程序首先根据该 key 的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry 的 value,但key不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部[/quote] 我的疑问是,这段话要怎么理解 因为当我定义 [code="java"] map.put(1,"a"); map.put(1,"b"); [/code] 此时map的size实际是1,map.get(1)为b也就是说后put的元素把前面的覆盖了。 所以我想知道的是这个Entry里有多个元素,该怎么理解?
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
进程通信方式总结与盘点
​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。 ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只可操作少量的...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
听说了吗?阿里双11作战室竟1根网线都没有
双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此。 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地狼藉”;到如今媲美5G的wifi网速,到现场却看不到一根网线;从当年使用商用AP(无线路由器),让光明顶双11当天断网一分钟,到全部使用阿里自研AP……阿里巴巴企业智能事业部工程师们提供的基础保障...
在阿里,40岁的奋斗姿势
在阿里,40岁的奋斗姿势 在阿里,什么样的年纪可以称为老呢?35岁? 在云网络,有这样一群人,他们的平均年龄接近40,却刚刚开辟职业生涯的第二战场。 他们的奋斗姿势是什么样的呢? 洛神赋 “翩若惊鸿,婉若游龙。荣曜秋菊,华茂春松。髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。” 爱洛神,爱阿里云 2018年,阿里云网络产品部门启动洛神2.0升...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
入职阿里5年,他如何破解“技术债”?
简介: 作者 | 都铎 作为一名技术人,你常常会听到这样的话: “先快速上线” “没时间改” “再缓一缓吧” “以后再解决” “先用临时方案处理” …… 当你埋下的坑越来越多,不知道哪天哪位同学就会踩上一颗雷。特别赞同“人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。” 作为一个程序员,我们反对复制粘贴,但是我们经常会见到相似的代码,相同的二方包,甚至整个代码...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
深度学习入门笔记(十八):卷积神经网络(一)
欢迎关注WX公众号:【程序员管小亮】 专栏——深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
你也能看懂的:蒙特卡罗方法
蒙特卡罗方法,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法 蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或...
相关热词 c#如何定义数组列表 c#倒序读取txt文件 java代码生成c# c# tcp发送数据 c#解决时间格式带星期 c#类似hashmap c#设置istbox的值 c#获取多线程返回值 c# 包含数字 枚举 c# timespan
立即提问