redis数据库如何存取
简而言之,Redis是一种强大的key-value数据库,之所以强大有两点:响应速度快(所以数据内存存储,只在必要时写入磁盘),特性丰富(支持多种数据类型,以及各类型上的复杂操作)。
事实上,Redis的一个重要特性就是它并非通常意义上的数据库,虽然称之为数据库是因为它可以为你存储和维护数据,但它并不像关系数据库那样提供任何的SQL方言。不过不用担心,Redis并不是吞噬数据的黑洞,它只是不支持SQL及相关功能,但却提供了稳健的协议用于与之交互。
在Redis中,没有数据表的概念,也无须关心select、join、view等操作或功能,同时也不提供类似于int或varchar的数据字段。你面对的将是相对原始的数据集合及数据类型。
探索之二:Available datatypes
下面我们深入看下这个奇怪的数据库是如何工作的。如上所见,Redis是基于key-value范式存储数据,所以先来重点看下"key"的概念。
key本质上就是简单的字符串,诸如"username"、"password"等。在定义key时,除了不能使用空格,你可以随意的使用普通的字符、数字等,像".",":","_"等在定义key时都能正常使用,所以像"user_name", "user:123:age", "user:123:username"都是不错的key的定义方式。
不像RDBMS中的字段名称,这里的key是Redis中的重要组成部分,所以我们必须在处理key时多加小心。在下面的讲述中,Redis并没有table的概念,所以像"SELECT username from users WHERE user_id=123;"这种简单任务都只能换种方式实现,为了达到这种目的,在Redis上,一种方式是通过key "user:123:username"来获取结果value。如你所见,key的定义中携带了神秘信息(像user ids)。在Redis中,key的重要性可见一斑。(其他key-value数据库中key的地位也是如此。)
如何用redis数据库存储r树
直观上看,数据库中的数据都是按表存储的;更微观地看,这些表都是按行存储的。每执行一
次select查询,数据库都会返回一个结果集,这个结果集由若干行组成。所以,一个自然而然
的想法就是在Redis中找到一种对应于数据库l行的数据结构。Redis中提供了五种基本数据结构
,即字符串(string)、列表(list)、哈希(hash)、集合(set)和有序集合(sorted
set)。经过调研,发现适合存储行的数据结构有两种,即string和hash。
要把数据库的行数据存入string,首先需要对行数据进行格式化。事实上,结果集的
每一行都可以看做若干由字段名和其对应值组成的键值对集合。这种键值对结构很容易让我们
想起Json格式。因此,这里选用Json格式作为结果集每一行的格式化模板。根据这一想法,我
们可以实现将结果集格式化为若干Json对象,并将Json对象转化为字符串存入Redis。
要把数据库的行数据存入hash,过程要比把数据存入string直观很多。这是由hash的结构性质
决定的——hash本身就是一个键值对集合:一个“父键”下面包含了很多“子键”,每个“子
键”都对应一个值。根据前面的分析可知,结果集中的每一行实际上也是键值对集合。用
Redis键值对集合表示数据库键值对集合应该再合适不过了:对于结果集中的某一行,字段对应
于hash的“子键”,字段对应的值就是hash“子键”对应的值,即结果集的一行刚好对应一个
hash
Redis hash是一个string类型的field和value的映射表.一个key可对应多个field,一个field对应一个value。将一个对象存储为hash类型,较于每个字段都存储成string类型更能节省内存。
redis 如何 把文件的内容 存进去
展开全部
最近学习下redis,作为一个高性能的k/v数据库,如果数据不用swap的话,redis的性能是无以伦比的。最近在做一个系统附件的缓存,试着把附件放到redis试试,写了个保存文件的方法。public class TestRedis{
Jedis redis = new Jedis("localhost");
//序列化方法
public byte[] object2Bytes(Object value) {
if (value == null)
return null;
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream outputStream;
try {
outputStream = new ObjectOutputStream(arrayOutputStream);
outputStream.writeObject(value);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
arrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return arrayOutputStream.toByteArray();
}
//反序列化方法
public Object byte2Object(byte[] bytes) {
if (bytes == null || bytes.length == 0)
return null;
try {
ObjectInputStream inputStream;
inputStream = new ObjectInputStream(new ByteArrayInputStream(bytes));
Object obj = inputStream.readObject();
return obj;
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
//保存文件方法
public void setFile(String key,String path){
File fr = new File(path);
redis.set(key.getBytes(), object2Bytes(fr));
}
//读取文件对象方法
public File getFile(String key){
Jedis redis = new Jedis("localhost");
File file = (File)byte2Object(redis.get(key.getBytes()));
return file;
}
public void testFile(String key,String path)throws Exception{
setFile("test", "D:\test.txt");
File file = getFile("test");
BufferedReader br = new BufferedReader(new FileReader(file));
String record = null;
while ((record = br.readLine()) != null) {
System.out.println("record:"+record);
}
}
public static void main(String[] args) throws Exception{
TestRedisos = new TestRedis();
os.testFile("test", "D:\test.txt");
}
}
redis怎么存数组和获取数组?
有两种方法:
1.把要存的数组序列化 或者 json_encode后 变成字符串再存。取的时候 反序列号或者json_decode处理成数组。
2.可以使用hash结构,以key作为1维,以hash中的field作为第二维。
redis 如何操作多维数组?
1.Redis用list这种一维数组来模拟二维。
2.序列化一下保存的数据,在原有的hset跟hget的基础上新增了两个方法 setArr跟getArr 调用 hset hget 用来保存多维数组的情况,这两个方法是在存之前,取之后都进行序列化操作。
3.用redis存多维数组,可以把数组json_encode转换成json各式数据,以string类型的方式存储。读取的时候再json_decode回来。
4.Redis本身不支持存取PHP数组的数据结构,但是如何存取PHP的数组呢?可以把数组序列化,以字符串的形式缓存到Redis中。
5.以使用hmset把PHP数组保存为hash类型的数据,使用hmget读取一维的键没问题,读取二维的多维的键就返回false。