日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis操作常用

發(fā)布時間:2024/10/6 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis操作常用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用Java操作Redis需要jedis-2.1.0.jar,下載地址:http://files.cnblogs.com/liuling/jedis-2.1.0.jar.zip

如果需要使用Redis連接池的話,還需commons-pool-1.5.4.jar,下載地址:http://files.cnblogs.com/liuling/commons-pool-1.5.4.jar.zip

?

刪除都是以del(String)

?

package com.test;

?

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

?

import org.junit.Before;

import org.junit.Test;

?

import redis.clients.jedis.Jedis;

?

public class TestRedis {

???private Jedis jedis;

???

???@Before

???public void setup() {

???????//連接redis服務(wù)器,192.168.0.100:6379

???????jedis = new Jedis("192.168.0.100", 6379);

???????//權(quán)限認證

???????jedis.auth("admin");?

??? }

???

???/**

????* redis存儲字符串

????*/

???@Test

???public void testString() {

???????//-----添加數(shù)據(jù)----------?

???????jedis.set("name","xinxin");//向key-->name中放入了value-->xinxin?

???????System.out.println(jedis.get("name"));//執(zhí)行結(jié)果:xinxin?

???????

???????jedis.append("name", " is my lover"); //拼接

???????System.out.println(jedis.get("name"));

???????

???????jedis.del("name");? //刪除某個鍵

???????System.out.println(jedis.get("name"));

???????//設(shè)置多個鍵值對

???????jedis.mset("name","liuling","age","23","qq","476777XXX");

???????jedis.incr("age"); //進行加1操作

???????System.out.println(jedis.get("name") + "-" +jedis.get("age") + "-" + jedis.get("qq"));

???????

??? }

???

???/**

????* redis操作Map

????*/

???@Test

???public void testMap() {

???????//-----添加數(shù)據(jù)----------?

???????Map<String, String> map = new HashMap<String, String>();

???????map.put("name", "xinxin");

???????map.put("age", "22");

???????map.put("qq", "123456");

???????jedis.hmset("user",map);

???????//取出user中的name,執(zhí)行結(jié)果:[minxr]-->注意結(jié)果是一個泛型的List?

???????//第一個參數(shù)是存入redis中map對象的key,后面跟的是放入map中的對象的key,后面的key可以跟多個,是可變參數(shù)?

???????List<String> rsmap = jedis.hmget("user","name", "age", "qq");

???????System.out.println(rsmap);?

?

???????//刪除map中的某個鍵值?

???????jedis.hdel("user","age");

???????System.out.println(jedis.hmget("user", "age")); //因為刪除了,所以返回的是null?

???????System.out.println(jedis.hlen("user")); //返回key為user的鍵中存放的值的個數(shù)2

???????System.out.println(jedis.exists("user"));//是否存在key為user的記錄 返回true?

???????System.out.println(jedis.hkeys("user"));//返回map對象中的所有key?

???????System.out.println(jedis.hvals("user"));//返回map對象中的所有value

?

???????Iterator<String>iter=jedis.hkeys("user").iterator();?

???????while (iter.hasNext()){?

???????????String key = iter.next();?

???????????System.out.println(key+":"+jedis.hmget("user",key));?

???????}?

??? }

???

???/**

????* jedis操作List

????*/?

???@Test?

???public void testList(){?

???????//開始前,先移除所有的內(nèi)容?

???????jedis.del("java framework");?

???????System.out.println(jedis.lrange("java framework",0,-1));?

???????//先向key java framework中存放三條數(shù)據(jù)?

???????jedis.lpush("java framework","spring");?

???????jedis.lpush("java framework","struts");?

???????jedis.lpush("java framework","hibernate");?

???????//再取出所有數(shù)據(jù)jedis.lrange是按范圍取出,?

???????// 第一個是key,第二個是起始位置,第三個是結(jié)束位置,jedis.llen獲取長度 -1表示取得所有?

???????System.out.println(jedis.lrange("java framework",0,-1));?

???????

???????jedis.del("java framework");

???????jedis.rpush("java framework","spring");?

???????jedis.rpush("java framework","struts");?

???????jedis.rpush("java framework","hibernate");

???????System.out.println(jedis.lrange("java framework",0,-1));

???}?

???

???/**

????* jedis操作Set

????*/?

???@Test?

???public void testSet(){?

???????//添加?

???????jedis.sadd("user","liuling");?

???????jedis.sadd("user","xinxin");?

???????jedis.sadd("user","ling");?

???????jedis.sadd("user","zhangxinxin");

???????jedis.sadd("user","who");?

???????//移除noname?

???????jedis.srem("user","who");?

???????System.out.println(jedis.smembers("user"));//獲取所有加入的value?

???????System.out.println(jedis.sismember("user","who"));//判斷 who 是否是user集合的元素?

???????System.out.println(jedis.srandmember("user"));?

???????System.out.println(jedis.scard("user"));//返回集合的元素個數(shù)?

???}?

?

???@Test?

???public void test() throws InterruptedException {?

???????//jedis 排序?

???????//注意,此處的rpush和lpush是List的操作。是一個雙向鏈表(但從表現(xiàn)來看的)?

???????jedis.del("a");//先清除數(shù)據(jù),再加入數(shù)據(jù)進行測試?

???????jedis.rpush("a", "1");?

? ??????jedis.lpush("a","6");?

???????jedis.lpush("a","3");?

???????jedis.lpush("a","9");?

???????System.out.println(jedis.lrange("a",0,-1));// [9, 3, 6,1]?

???????System.out.println(jedis.sort("a")); //[1, 3, 6, 9]? //輸入排序后結(jié)果?

???????System.out.println(jedis.lrange("a",0,-1));?

???}?

???

???@Test

???public void testRedisPool() {

???????RedisUtil.getJedis().set("newname", "中文測試");

???????System.out.println(RedisUtil.getJedis().get("newname"));

??? }

}

?

?

?

?

?

一、常用數(shù)據(jù)類型簡介:

? ?? redis常用五種數(shù)據(jù)類型:string,hash,list,set,zset(sorted?set).

1.String類型

String是最簡單的類型,一個key對應一個value

String類型的數(shù)據(jù)最大1G
String類型的值可以被視作integer,從而可以讓“INCR”命令族操作(incrby、decr、decrby),這種情況下,該integer的值限制在64位有符號數(shù)。

在list、set和zset中包含的獨立的元素類型都是Redis?String類型。

2.List類型

鏈表類型,主要功能是push、pop、獲取一個范圍的所有值等。其中的key可以理解為鏈表的名字。

在Redis中,list就是Redis?String的列表,按照插入順序排序。比如使用LPUSH命令在list頭插入一個元素,使用RPUSH命令在list的尾插入一個元素。當這兩個命令之一作用于一個空的key時,一個新的list就創(chuàng)建出來了。

List的最大長度是2^32-1個元素。

3.Set類型

集合,和數(shù)學中的集合概念相似。操作中的key理解為集合的名字。

在Redis中,set就是Redis?String的無序集合,不允許有重復元素。

Set的最大元素數(shù)是2^32-1

Redis中對set的操作還有交集、并集、差集等。

4.ZSet(Sorted?Set)類型

Zset是set的一個升級版本,在set的基礎(chǔ)上增加了一個順序?qū)傩?#xff0c;這一屬性在添加修改元素時可以指定,每次指定后zset會自動安裝指定值重新調(diào)整順序。可以理解為一張表,一列存value,一列存順序。操作中的key理解為zset的名字。

Zset的最大元素數(shù)是2^32-1

對于已經(jīng)有序的zset,仍然可以使用SORT命令,通過指定ASC|DESC參數(shù)對其進行排序。

5.hash類型

hash是最接近關(guān)系數(shù)據(jù)庫結(jié)構(gòu)的數(shù)據(jù)類型,可以將數(shù)據(jù)庫一條記錄或程序中一個對象轉(zhuǎn)換成hashmap存放在redis中。

二、jedis操作命令:

1.對value操作的命令

?????exists(key):確認一個key是否存在

?????del(key):刪除一個key

?????type(key):返回值的類型

?????keys(pattern):返回滿足給定pattern的所有key

?????randomkey:隨機返回key空間的一個key

?????rename(oldname,?newname):將key由oldname重命名為newname,若newname存在則刪除newname表示的key

?????dbsize:返回當前數(shù)據(jù)庫中key的數(shù)目

?????expire:設(shè)定一個key的活動時間(s)

?????ttl:獲得一個key的活動時間

?????select(index):按索引查詢

?????move(key,?dbindex):將當前數(shù)據(jù)庫中的key轉(zhuǎn)移到有dbindex索引的數(shù)據(jù)庫

?????flushdb:刪除當前選擇數(shù)據(jù)庫中的所有key

?????flushall:刪除所有數(shù)據(jù)庫中的所有key

2.對String操作的命令

?????set(key,?value):給數(shù)據(jù)庫中名稱為key的string賦予值value

?????get(key):返回數(shù)據(jù)庫中名稱為key的string的value

?????getset(key,?value):給名稱為key的string賦予上一次的value

?????mget(key1,?key2,…,?key?N):返回庫中多個string(它們的名稱為key1,key2…)的value

?????setnx(key,?value):如果不存在名稱為key的string,則向庫中添加string,名稱為key,值為value

?????setex(key,?time,?value):向庫中添加string(名稱為key,值為value)同時,設(shè)定過期時間time

?????mset(key1,?value1,?key2,?value2,…key?N,?value?N):同時給多個string賦值,名稱為key?i的string賦值value?i

?????msetnx(key1,?value1,?key2,?value2,…key?N,?value?N):如果所有名稱為key?i的string都不存在,則向庫中添加string,名稱 ? ? ? ? ?key?i賦值為value?i

?????incr(key):名稱為key的string增1操作

?????incrby(key,?integer):名稱為key的string增加integer

?????decr(key):名稱為key的string減1操作

?????decrby(key,?integer):名稱為key的string減少integer

?????append(key,?value):名稱為key的string的值附加value

?????substr(key,?start,?end):返回名稱為key的string的value的子串

3.對List操作的命令

?????rpush(key,?value):在名稱為key的list尾添加一個值為value的元素

?????lpush(key,?value):在名稱為key的list頭添加一個值為value的?元素

?????llen(key):返回名稱為key的list的長度

?????lrange(key,?start,?end):返回名稱為key的list中start至end之間的元素(下標從0開始,下同)

?????ltrim(key,?start,?end):截取名稱為key的list,保留start至end之間的元素

?????lindex(key,?index):返回名稱為key的list中index位置的元素

?????lset(key,?index,?value):給名稱為key的list中index位置的元素賦值為value

?????lrem(key,?count,?value):刪除count個名稱為key的list中值為value的元素。count為0,刪除所有值為value的元素,count>0 ? ? ?從頭至尾刪除count個值為value的元素,count<0從尾到頭刪除|count|個值為value的元素。

?????lpop(key):返回并刪除名稱為key的list中的首元素

?????rpop(key):返回并刪除名稱為key的list中的尾元素

?????blpop(key1,?key2,…?key?N,?timeout):lpop 命令的block版本。即當timeout為0時,若遇到名稱為key?i的list不存在或該list為空,則命令結(jié)束。如果 timeout>0,則遇到上述情況時,等待timeout秒,如果問題沒有解決,則對key?i+1開始的list執(zhí)行pop操作。

?????brpop(key1,?key2,…?key?N,?timeout):rpop的block版本。參考上一命令。

?????rpoplpush(srckey,?dstkey):返回并刪除名稱為srckey的list的尾元素,并將該元素添加到名稱為dstkey的list的頭部

4.對Set操作的命令

?????sadd(key,?member):向名稱為key的set中添加元素member

?????srem(key,?member)?:刪除名稱為key的set中的元素member

?????spop(key)?:隨機返回并刪除名稱為key的set中一個元素

?????smove(srckey,?dstkey,?member)?:將member元素從名稱為srckey的集合移到名稱為dstkey的集合

?????scard(key)?:返回名稱為key的set的基數(shù)

?????sismember(key,?member)?:測試member是否是名稱為key的set的元素

?????sinter(key1,?key2,…key?N)?:求交集

?????sinterstore(dstkey,?key1,?key2,…key?N)?:求交集并將交集保存到dstkey的集合

?????sunion(key1,?key2,…key?N)?:求并集

?????sunionstore(dstkey,?key1,?key2,…key?N)?:求并集并將并集保存到dstkey的集合

?????sdiff(key1,?key2,…key?N)?:求差集

?????sdiffstore(dstkey,?key1,?key2,…key?N)?:求差集并將差集保存到dstkey的集合

?????smembers(key)?:返回名稱為key的set的所有元素

?????srandmember(key)?:隨機返回名稱為key的set的一個元素

5.對zset(sorted?set)操作的命令

?????zadd(key,?score,?member):向名稱為key的zset中添加元素member,score用于排序。如果該元素已經(jīng)存在,則根據(jù)score更新該元素的順序。

?????zrem(key,?member)?:刪除名稱為key的zset中的元素member

?????zincrby(key,?increment,?member)?:如果在名稱為key的zset中已經(jīng)存在元素member,則該元素的score增加increment;否則向集合中添加該元素,其score的值為increment

?????zrank(key,?member)?:返回名稱為key的zset(元素已按score從小到大排序)中member元素的rank(即index,從0開始),若沒有member元素,返回“nil”

?????zrevrank(key,?member)?:返回名稱為key的zset(元素已按score從大到小排序)中member元素的rank(即index,從0開始),若沒有member元素,返回“nil”

?????zrange(key,?start,?end):返回名稱為key的zset(元素已按score從小到大排序)中的index從start到end的所有元素

?????zrevrange(key,?start,?end):返回名稱為key的zset(元素已按score從大到小排序)中的index從start到end的所有元素

?????zrangebyscore(key,?min,?max):返回名稱為key的zset中score?>=?min且score?<=?max的所有元素

?????zcard(key):返回名稱為key的zset的基數(shù)

?????zscore(key,?element):返回名稱為key的zset中元素element的score

?????zremrangebyrank(key,?min,?max):刪除名稱為key的zset中rank?>=?min且rank?<=?max的所有元素

?????zremrangebyscore(key,?min,?max)?:刪除名稱為key的zset中score?>=?min且score?<=?max的所有元素

?????zunionstore?/?zinterstore(dstkeyN,?key1,…,keyN,?WEIGHTS?w1,…wN,?AGGREGATE?SUM|MIN|MAX):對N個zset求并集和交集,并將最后的集合保存在dstkeyN中。對于集合中每一個元素的score,在進行AGGREGATE運算前,都要乘以對于的WEIGHT參數(shù)。如果沒有提供WEIGHT,默認為1。默認的AGGREGATE是SUM,即結(jié)果集合中元素的score是所有集合對應元素進行 SUM運算的值,而MIN和MAX是指,結(jié)果集合中元素的score是所有集合對應元素中最小值和最大值。

6.對Hash操作的命令

?????hset(key,?field,?value):向名稱為key的hash中添加元素field<—>value

?????hget(key,?field):返回名稱為key的hash中field對應的value

?????hmget(key,?field1,?…,field?N):返回名稱為key的hash中field?i對應的value

?????hmset(key,?field1,?value1,…,field?N,?value?N):向名稱為key的hash中添加元素field?i<—>value?i

?????hincrby(key,?field,?integer):將名稱為key的hash中field的value增加integer

?????hexists(key,?field):名稱為key的hash中是否存在鍵為field的域

?????hdel(key,?field):刪除名稱為key的hash中鍵為field的域

?????hlen(key):返回名稱為key的hash中元素個數(shù)

?????hkeys(key):返回名稱為key的hash中所有鍵

?????hvals(key):返回名稱為key的hash中所有鍵對應的value

?????hgetall(key):返回名稱為key的hash中所有的鍵(field)及其對應的value

三、各種數(shù)據(jù)類型所對應的應用場景

1.String類型的應用場景

? ?String是最常用的一種數(shù)據(jù)類型,普通的key/value存儲.

2.list類型的應用場景

? ?比較適用于列表式存儲且順序相對比較固定,例如:

省份、城市列表

品牌、廠商、車系、車型等列表

拆車坊專題列表...

3.set類型的應用場景

? ?Set對外提供的功能與list類似,當需要存儲一個列表數(shù)據(jù),又不希望出現(xiàn)重復數(shù)據(jù)時,可選用set

4.zset(sorted?set)類型的應用場景

zset的使用場景與set類似,區(qū)別是set不是自動有序的,而zset可以通過用戶額外提供一個優(yōu)先級(score)的參數(shù)來為成員排序,并且是插入有序的,即自動排序.當你需要一個有序的并且不重復的集合列表,那么可以選擇zset數(shù)據(jù)結(jié)構(gòu)。例如:

根據(jù)PV排序的熱門車系車型列表

根據(jù)時間排序的新聞列表

5.hash類型的應用場景

類似于表記錄的存儲

頁面視圖所需數(shù)據(jù)的存儲

四、具體使用參考示例:

? privatevoid testKey() {

???????System.out.println("=============key==========================");

??????? //?清空數(shù)據(jù)

???????System.out.println(jedis.flushDB());

???????System.out.println(jedis.echo("foo"));

??????? //?判斷key否存在

???????System.out.println(shardedJedis.exists("foo"));

???????shardedJedis.set("key", "values");

???????System.out.println(shardedJedis.exists("key"));

??? }

?

??? privatevoid testString() {

???????System.out.println("=============String==========================");

??????? //?清空數(shù)據(jù)

???????System.out.println(jedis.flushDB());

??????? //?存儲數(shù)據(jù)

???????shardedJedis.set("foo", "bar");

???????System.out.println(shardedJedis.get("foo"));

??????? //?key不存在,則存儲

???????shardedJedis.setnx("foo", "foo not exits");

???????System.out.println(shardedJedis.get("foo"));

??????? //?覆蓋數(shù)據(jù)

??????? shardedJedis.set("foo","foo update");

???????System.out.println(shardedJedis.get("foo"));

??????? //?追加數(shù)據(jù)

???????shardedJedis.append("foo", " hello, world");

???????System.out.println(shardedJedis.get("foo"));

??????? //?設(shè)置key的有效期,并存儲數(shù)據(jù)

???????shardedJedis.setex("foo", 2, "foo not exits");

???????System.out.println(shardedJedis.get("foo"));

??????? try {

???????????Thread.sleep(3000);

??????? }catch (InterruptedException e) {

??????? }

???????System.out.println(shardedJedis.get("foo"));

??????? //?獲取并更改數(shù)據(jù)

???????shardedJedis.set("foo", "foo update");

???????System.out.println(shardedJedis.getSet("foo", "foomodify"));

??????? //?截取value的值

???????System.out.println(shardedJedis.getrange("foo", 1, 3));

??????? System.out.println(jedis.mset("mset1","mvalue1", "mset2", "mvalue2", "mset3","mvalue3", "mset4", "mvalue4"));

???????System.out.println(jedis.mget("mset1", "mset2","mset3", "mset4"));

???????System.out.println(jedis.del(new String[] { "foo","foo1", "foo3" }));

??? }

?

??? privatevoid testList() {

???????System.out.println("=============list==========================");

??????? //?清空數(shù)據(jù)

???????System.out.println(jedis.flushDB());

??????? //?添加數(shù)據(jù)

???????shardedJedis.lpush("lists", "vector");

??????? shardedJedis.lpush("lists","ArrayList");

???????shardedJedis.lpush("lists", "LinkedList");

??????? //?數(shù)組長度

???????System.out.println(shardedJedis.llen("lists"));

??????? //?排序

???????System.out.println(shardedJedis.sort("lists"));

??????? //?字串

??????? System.out.println(shardedJedis.lrange("lists",0, 3));

??????? //?修改列表中單個值

???????shardedJedis.lset("lists", 0, "hello list!");

??????? //?獲取列表指定下標的值

???????System.out.println(shardedJedis.lindex("lists", 1));

??????? //?刪除列表指定下標的值

???????System.out.println(shardedJedis.lrem("lists", 1,"vector"));

??????? //?刪除區(qū)間以外的數(shù)據(jù)

???????System.out.println(shardedJedis.ltrim("lists", 0, 1));

??????? //?列表出棧

???????System.out.println(shardedJedis.lpop("lists"));

??????? //?整個列表值

??????? System.out.println(shardedJedis.lrange("lists",0, -1));

?

??? }

?

??? privatevoid testSet() {

???????System.out.println("=============set==========================");

??????? //?清空數(shù)據(jù)

???????System.out.println(jedis.flushDB());

??????? //?添加數(shù)據(jù)

??????? shardedJedis.sadd("sets","HashSet");

???????shardedJedis.sadd("sets", "SortedSet");

???????shardedJedis.sadd("sets", "TreeSet");

??????? //?判斷value是否在列表中

???????System.out.println(shardedJedis.sismember("sets","TreeSet"));

??????? ;

??????? //?整個列表值

??? ????System.out.println(shardedJedis.smembers("sets"));

??????? //?刪除指定元素

???????System.out.println(shardedJedis.srem("sets","SortedSet"));

??????? //?出棧

???????System.out.println(shardedJedis.spop("sets"));

???????System.out.println(shardedJedis.smembers("sets"));

??????? //

???????shardedJedis.sadd("sets1", "HashSet1");

???????shardedJedis.sadd("sets1", "SortedSet1");

???????shardedJedis.sadd("sets1", "TreeSet");

???????shardedJedis.sadd("sets2", "HashSet2");

??????? shardedJedis.sadd("sets2","SortedSet1");

???????shardedJedis.sadd("sets2", "TreeSet1");

??????? //?交集

???????System.out.println(jedis.sinter("sets1", "sets2"));

??????? //?并集

???????System.out.println(jedis.sunion("sets1", "sets2"));

??????? //?差集

??? ????System.out.println(jedis.sdiff("sets1","sets2"));

??? }

?

??? privatevoid testSortedSet() {

???????System.out.println("=============zset==========================");

??????? //?清空數(shù)據(jù)

???????System.out.println(jedis.flushDB());

??????? //?添加數(shù)據(jù)

?????? ?shardedJedis.zadd("zset", 10.1,"hello");

???????shardedJedis.zadd("zset", 10.0, ":");

???????shardedJedis.zadd("zset", 9.0, "zset");

???????shardedJedis.zadd("zset", 11.0, "zset!");

??????? //?元素個數(shù)

???????System.out.println(shardedJedis.zcard("zset"));

??????? //?元素下標

???????System.out.println(shardedJedis.zscore("zset","zset"));

??????? //?集合子集

???????System.out.println(shardedJedis.zrange("zset", 0, -1));

??????? //?刪除元素

???????System.out.println(shardedJedis.zrem("zset","zset!"));

??????? System.out.println(shardedJedis.zcount("zset",9.5, 10.5));

??????? //?整個集合值

???????System.out.println(shardedJedis.zrange("zset", 0, -1));

??? }

?

??? privatevoid testHash() {

???????System.out.println("=============hash==========================");

?? ?????//?清空數(shù)據(jù)

???????System.out.println(jedis.flushDB());

??????? //?添加數(shù)據(jù)

???????shardedJedis.hset("hashs", "entryKey","entryValue");

???????shardedJedis.hset("hashs", "entryKey1","entryValue1");

???????shardedJedis.hset("hashs", "entryKey2","entryValue2");

??????? //?判斷某個值是否存在

???????System.out.println(shardedJedis.hexists("hashs","entryKey"));

??????? //?獲取指定的值

???????System.out.println(shardedJedis.hget("hashs","entryKey"));??????? //?批量獲取指定的值

???????System.out.println(shardedJedis.hmget("hashs","entryKey", "entryKey1"));

??????? //?刪除指定的值

???????System.out.println(shardedJedis.hdel("hashs","entryKey"));

??????? //?key中的域?field?的值加上增量?increment

???????System.out.println(shardedJedis.hincrBy("hashs","entryKey", 123l));

??????? //?獲取所有的keys

???????System.out.println(shardedJedis.hkeys("hashs"));

??????? //?獲取所有的values

???????System.out.println(shardedJedis.hvals("hashs"));

??? }



總結(jié)

以上是生活随笔為你收集整理的redis操作常用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。