一、本地安装设置

1.本地测试安装

在电脑开始页面 输入 cmd

2.输入redis-cli打开redis系统

注意:redis里面会出现这种情况 是因为没有登录的原因 解决输入密码 auth 123456

二、基础常用命令

  • set key value 用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类型。

set k1 v1   //向Redis中设置一个k1的键值对

set k1 100 //将k1的值由v1重置为100

  • get key 用于获取指定 key 的值。如果 key 不存在,返回 nil 。

  • append key value 将给定的value追加到key原值末尾。

如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾。

如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样。

  • setex key time value 给指定的 key 设置值及time 秒的过期时间。如果 key 已经存在, setex命令将会替换旧的值,并设置过期时间。

setex k1 10 v1 //向Redis中设置一个k1的键值对并且10秒后过期

  • setnx key value当key不存在时,设置给定 key 的值。如果key存在,则没有任何影响。

setnx k1 v1 //向Redis中设置一个k1的键值对

setnx k1 v2 //Redis中存在k1,则没有影响,k1的值仍然为v1

  • incr key 将 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作。

如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

incr k1 //因为Redis中不存在k1,所以先初始化为0,再递增,值为1

incr k1 //存在k1,递增后k1的值为2

set k2 v2

incr k2 //因为k2不为数值,Redis返回一个错误

  • decr key将 key 中储存的数字值减一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 decr 操作。

如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

decr k1 //因为Redis中不存在k1,所以先初始化为0,再递增,值为-1

decr k1 //存在k1,递增后k1的值为-2

set k2 v2

decr k2 //因为k2不为数值,Redis返回一个错误

  • incrby/decrby key step 将key存储的数字值按照step进行增减。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby/decrby 命令。

如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

  • mset key1 value1 key2 value2 ……同时设置一个或多个 key-value 。

mset k1 v1 k2 v2 k3 v3 //同时向Redis中设置了k1 k2 k3

  • mget key1 key2 ……返回所有(一个或多个)给定 key 的值。

如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。

mget k1 k2 //同时获取k1 k2

  • msetnx key1 value1 key2 value2 ……用于所有给定 key 都不存在时,同时设置一个或多个key-value 。

msetnx具有原子性特性,有一个失败,则都失败。

msetnx k1 v1 k2 v2 //向Redis中设置k1 k2两个键值对

msetnx k1 v2 k3 v2 //Redis中存在k1,k1设置失败,由于原子性特性,k3也设置失败

  • getrange key start end用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由start 和 end 两个偏移量决定(包括 start 和 end 在内)。

set java helloworld //设置一个key为java,value为helloworld的值

getrange java 0 3 //获取索引0-3的值,结果为hell

  • setrange key offset value用指定的字符串重写给定 key 所储存的字符串值,重写的位置从偏移量 offset 开始。

set java helloworld //设置一个key为java,value为helloworld的值

setrange java 5 baizhan //从偏移位置5(w)开始,用baizhan重写key

  • move key db 将当前数据库的 key 移动到给定的数据库 db 当中。

move k1 8 //将k1从当前数据库移动到8号库

  • type key 查看当前key 所储存的值的类型。

返回当前key所储存的值的类型,如string 、list等。

  • del key 删除已存在的key,不存在的 key 会被忽略。可以设置多个key,返回删除成功的个数。

del k1 删除k1,如果成功返回1,失败返回0

del k1 k2 k3 删除k1 k2 k3,如果k1 k2存在,k3不存在,则返回2

  • 可以使用select 进行数据库切换。

select 8 //切换到8号数据库

三. 五大数据类型-List(列表)

3.1 简介

List是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

底层是一个双向链表,对两段操作性能极高,通过索引操作中间的节点性能较差。

3.2 常用命令

  • lpush/ rpush key1 value1 value2 value3……从左边(头部)/右边(尾部)插入一个或多个值。

lpush k1 v1 v2 v3 //从左边放入v1 v2 v3

rpush k1 v4 v5 v6 //从右边放入v4 v5 v6

  • lrange key start end返回key列表中的start和end之间的元素(包含start和end)。 其中 0 表示列表的第一个元素,-1表示最后一个元素。

lrange k1 0 2 //取出列表里前3个值,结果为v3 v2 v1

lrange k1 0 -1 //取出列表里全部值,结果为v3 v2 v1 v4 v5 v6

  • lpop/rpop key移除并返回第一个值/最后一个值。

值在键在,值光键亡。

lpop k1 //从列表中删除v3,并返回,当前列表全部值v2 v1 v4 v5 v6

rpop k1 //从列表中删除v6,并返回,当前列表全部值v2 v1 v4 v5

  • lindex key index 获取列表index位置的值(从左开始)。

  • llen key获取列表长度。

  • lrem key count value从左边开始删除与value相同的count个元素。

lrem k1 2 v1 //从左边开始删除k1列表中2个v1元素

  • linsert key before/after value newvalue 在列表中value值的前边/后边插入一个newvalue值

(从左开始)。

linsert k1 before v1 v5 //在v1前面插入一个v5

  • lset key index value将索引为index的值设置为value

四. 五大数据类型-Set(集合)

4.1 简介

与List类似是一个列表功能,但Set是自动排重的,当需要存储一个列表数据,又不希望出现重复数据时,Set是一个很好的选择。

Set是String类型的无序集合,它底层其实是一个value为null的hash表,所以添加、删除、查找的时间复杂度都是O(1)。

一般来说,一个算法如果是O(1),随着数据增加,查找数据的时间不变。集合中最大的成员数为 ( 每个集合超过40亿个元素)。

4.2 常用命令

  • sadd key value1 value2……将一个或多个元素添加到集合key中,已经存在的元素将被忽略。

sadd k1 v1 v2 v2 v3 v4 v5 v6 //向集合中添加值,最终只有v1 v2 v3 v4 v5 v6

  • smembers key取出该集合的所有元素。

smembers k1

  • sismember key value判断集合key中是否含有value元素,如有返回1,否则返回0。

sismember k1 v1

  • scard key返回该集合的元素个数。

scard k1

  • srem key value1 value2……删除集合中的一个或多个成员元素,不存在的成员元素会被忽略。

srem k1 v1 v2 //删除v1 v2

  • spop key随机删除集合中一个元素并返回该元素。

spop k1 //随机删除一个元素,并返回

  • srandmember key count随机取出集合中count个元素,但不会删除。

srandmember k1 2 //随机取出集合中的2个元素

  • smove sourcekey destinationkey value将value元素从sourcekey集合移动到destinationkey集合中。

如果 sourcekey集合不存在或不包含指定的 value元素,则 smove 命令不执行任何操作,仅返回 0。

smove k1 k2 v5 //将元素v5从集合k1中移动到集合k2

  1. sinter key1 key2返回两个集合的交集元素。
  2. sunion key1 key2返回两个集合的并集元素。
  3. sdiff key1 key2返回两个集合的差集元素(key1中的,不包含key2)

sinter k1 k2 //返回v3

sunion k1 k2 //返回v1 v2 v3 v4 v5

sdiff k1 k2 //返回v1 v2

sdiff k2 k1 //返回v4 v5

五、 五大数据类型-Hash(哈希)

5.1 简介

Hash是一个键值对的集合。

Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

每个 Hash 可以存储 键值对(40多亿)。

Hash存储结构优化

如果field数量较少,存储结构优化为类数组结构

如果field数量较多,存储结构使用HashMap结构

5.2 常用命令

  • hset key field value给key集合中的field赋值value。

如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

如果字段已经存在于哈希表中,旧值将被重写。

hset user name baizhan //创建一个key为user的哈希,并创建name字段,给name字段赋值为

baizhan

hset user age 3     //在key为user的哈希中,创建age字段赋值为3

hset user name shangxuetang //将key为user的哈希name字段修改为shangxuetang

  • hget key field从key哈希中,取出field字段的值。

hget user name //从key为user的哈希中取出name字段的值,结果为shangxuetang

  • hmset key field1 value1 field2 value2……批量设置哈希的字段及值。

hmset user1 name bjsxt age 15 //创建一个key为user1的哈希,有两个字段name和age

  • hexists key field 判断指定key中是否存在field

如果哈希表含有给定字段,返回 1 。 如果哈希表不含有给定字段,或 key 不存在,返回 0 。

hexists user name //返回1

  • hkeys key获取该哈希中所有的field。

  • hvals key获取该哈希中所有的value。

  • hincrby key field increment为哈希表key中的field字段的值加上增量increment。

增量也可以为负数,相当于对指定字段进行减法操作。

如果哈希表的 key 不存在,一个新的哈希表被创建并执行 hincrby 命令。

如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。

对一个储存字符串值的字段执行 hincrby 命令将造成一个错误。

hincrby user age 10 //对user中的age字段做运算,增加10

  • hdel key field1 field2……删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。

返回被成功删除字段的数量,不包括被忽略的字段。

hdel user name age //删除user中的name和age字段

  • hsetnx key field value给key哈希表中不存在的的字段赋值 。

如果哈希表不存在,一个新的哈希表被创建并进行 hsetnx 操作。

如果字段已经存在于哈希表中,操作无效。

如果 key 不存在,一个新哈希表被创建并执行 hsetnx 命令。

hsetnx user name

六、 五大数据类型-Zset(有序集合)

6.1 简介

Zset与Set非常相似,是一个没有重复元素的String集合。

不同之处是Zset的每个元素都关联了一个分数(score),这个分数被用来按照从低分到高分的方式排序集合中的元素。集合的元素是唯一的,但分数可以重复。

因为元素是有序的,所以可以根据分数(score)或者次序(position)来获取一个范围内的元素。

6.2 常用命令

  • zadd key score1 value1 score2 value2……将一个或多个元素(value)及分数(score)加入到有序集key中。

如果某个元素已经是有序集的元素,那么更新这个元素的分数值,并通过重新插入这个元素,来保证该元素在正确的位置上。

分数值可以是整数值或双精度浮点数。

如果有序集合 key 不存在,则创建一个空的有序集并执行 zadd 操作。

zadd k1 100 java 200 c++ 300 python 400 php

  • zrange key start end [withscores]返回key集合中的索引start和索引end之间的元素(包含start和end)。

其中元素的位置按分数值递增(从小到大)来排序。 其中 0 表示列表的第一个元素,-1表示最后一个元素。

withscores是可选参数,是否返回分数。

zrange k1 0 -1 //返回集合中所有元素

zrange k1 0 -1 withscores //返回集合中所有元素,并携带元素分数

  • zrangebyscore key minscore maxscore [withscores]返回key集合中的分数minscore 和分数

maxscore 之间的元素(包含minscore 和maxscore )。其中元素的位置按分数值递增(从小到大)来排序。

zrangebyscore k1 200 400 //返回200-400分之间的元素递增排序

  • zrevrangebyscore key maxscore minscore [withscores]返回key集合中的分数maxscore和

分数minxscore 之间的元素(包含maxscore和minxscore )。其中元素的位置按分数值递减(从大到小)来排序。

zrevrangebyscore k1 400 200 //返回200-400分之间的元素递减法排序

  • zincrby key increment value为元素value的score加上increment的值。

zincrby k1 50 java //给java元素加上50分

  • zrem key value删除该集合下value的元素。

zrem k1 php 删除php

  • zcount key minscore maxscore统计该集合在minscore 到maxscore分数区间中元素的个数。

zcount k1 100 300 统计100分到300分中间元素的个数

  • zrank key value返回value在集合中的排名,从0开始。

zrank k1 c++ 返回c++排名

七、新数据类型-Bitmaps

7.1 简介

在计算机中,用二进制(位)作为存储信息的基本单位,1个字节等于8位。

例如 "abc" 字符串是由 3 个字节组成,计算机存储时使用其二进制表示,"abc"分别对应的ASCII码是97、98、99,对应的二进制是01100001、01100010、01100011,在内存中表示如下:

合理地使用 位 能够有效地提高内存使用率和开发效率。

Redis提供了Bitmaps这个 “数据结构” 可以实现对位的操作:

  • Bitmaps 本身不是一种数据结构,实际上它就是字符串(key 对应的 value 就是上图中的一串二进

制),但是它可以对字符串的位进行操作。

  • Bitmaps 单独提供了一套命令,所以在 Redis 中使用 Bitmaps 和使用字符串的方法不太相同。可以把 Bitmaps 想象成一个以位为单位的数组,数组的每个单元只能存储 0 和 1,数组的下标在Bitmaps中叫做偏移量。

7.2 常用命令

  • setbit key offset value设置Bitmaps中某个偏移量的值。

偏移量从0开始,且value值只能为0或1。

setbit sign 0 1 设置sign的第一位值为1

setbit sign 1 1 设置sign的第二位值为1

setbit sign 2 0 设置sign的第三位值为0

setbit sign 3 1 设置sign的第四位值为1

  • getbit key offset 获取Bitmaps中某个偏移量的值。

获取key的offset 的值。

getbit sign 3 //获取偏移量为3的值,结果为1

  • bitcount key [start end]统计字符串被设置为1的bit数量。一般情况下,给定的整个字符串都会被进行统计,可以选择通过额外的start和end参数,指定字节组范围内进行统计(包括start和end),0表示第一个元素,-1表示最后一个元素。

bitcount sign //获取整个字符串被设置为1的bit数量,结果为3

如:当前存在一个key为k1的bitmaps存储着[00000001,00000001,00000010,00000011],分别对应[1,1,2,3]。

setbit num 7 1

setbit num 15 1

setbit num 22 1

setbit num 30 1

setbit num 31 1

bitcount num 1 2 统计索引1、2两个字节组中bit=1的数量,即统计00000001,00000010中

bit=1的数量,结果为2

bitcount num 1 3 统计索引1、2、3三个字节组中bit=1的数量,即统计

00000001,00000010,00000011中bit=1的数量,结果为4

bitcount num 0 -1 统计所有的字节组中bit=1的数量,结果为5

setbit设置或获取的是bit(位)的位置,bitcount计算的是byte(字节)位置。

  • bitop and/or destkey sourcekey1 sourcekey2……将多个bitmaps通过求交集/并集方式合并成一个新的bitmaps。

bitop and k3 k1 k2 通过求交集将k1 k2合并成k3

bitop or k3 k1 k2 通过求并集将k1 k2合并成k3

八、 新数据类型-Geospatia

8.1 简介

GEO,Geographic,地理信息的缩写。

该类型就是元素的二维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作。

8.2 常用命令

  • geoadd key longitude latitude member [longitude latitude member ..……]用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。

geoadd chinacity 116.405285 39.904989 beijing //将北京的经纬度和名称添加到chinacity

geoadd chinacity 104.065735 30.659462 chengdu 121.472644 31.231706 shanghai //将成都和上海的经纬度、名称添加到chinacity

有效的经度:-180 ~ +180 有效的纬度:-85.05 ~ +85.05,当设置的经度纬度值超过范围会报错。

两级无法直接添加。

一般会直接下载城市数据,直接通过java程序直接一次性导入。

  • geopos key member [member ……]**从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。

  • geodist key member1 member2 [m|km|ft|mi]用于返回两个给定位置之间的距离。

最后一个距离单位参数说明:

m :米,默认单位。 km :千米。mi :英里。ft :英尺。

geodist chinacity shanghai beijing //返回shanghai和beijing之间的距离,结果1067597.9668,单位米

geodist chinacity shanghai chengdu km // 返回shanghai和chengdu之间的距离,结果1660.0198,单位是千米

  • georadius key longitude latitude radius m|km|ft|mi 以给定的经纬度(longitudelatitude)为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离(radius )的所有位置元素。

georadius chinacity 116 40 1200 km //获取经纬度116 40为中心,在chinacity内1200公里范围内的所有元素。结果shanghai beijing

九、 新数据类型-Hyperloglog

9.1 简介

在我们做站点流量统计的时候一般会统计页面UV(独立访客:unique visitor)和PV(即页面浏览量:pageview)。

什么是基数?

数据集{1,2,5,7,5,7,9},那么这个数据集的基数集为{1,2,5,7,9},基数(不重复元素)为5,基数估计就是在误差可接受范围内,快速计算基数。

如果是通过Redis来处理,我们可以使用String类型然后自增计数即可达到统计PV,统计UV可以使用Set,每个用户id是唯一的可以放到这个集合里。

以上方案虽然结果准确,但随着数据不断增加,导致占用的内存空间越来越大,对于非常大的数据集是不合适的。

Hyperloglog 是一种基数估算统计,在输入元素的数量特别巨大时,计算基数所需的空间是固定的,并且很小。

在Redis中,每个Hyperloglog 只占用12KB内存,就可以计算接近 个不同元素的基数。

因为HyperLogLog 只会更具输入元素来计算基数,而不会存储输入元素本身,所以Hyperloglog 不能像集合那样,返回输入的各个元素。

9.2 常用命令

  • pfadd key element1 element2……将所有元素参数添加到 Hyperloglog 数据结构中。

如果至少有个元素被添加返回 1, 否则返回 0。

pfadd book1 java c++ 添加两个元素,当前book1数量为2

pfadd book1 java php 添加一个元素,当前book1数量为3

  • pfcount key1 key2……计算Hyperloglog 近似基数,可以计算多个Hyperloglog ,统计基数总数。

pfcount book1 //计算book1的基数,结果为3

pfadd book2 chinese math //添加两个元素到book2中

pfcount book1 book2 //统计两个key的基数总数,结果为5

  • pfmerge destkey sourcekey1 sourcekey2……将一个或多个Hyperloglog(sourcekey1) 合并成一个Hyperloglog (destkey )。

比如每月活跃用户可用每天活跃用户合并后计算。

pfmerge book book1 book2 //将book1和book2合并成book,结果为5

十一、发布与订阅

11.1 什么是发布与订阅

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

Redis 客户端可以订阅任意数量的频道。

11.2 Redis的发布与订阅

  • 客户端订阅频道

  • 当给这个频道发送消息后,消息就会发送给订阅的客户端

  • Redis中发布与订阅命令

订阅:subscribe channel 订阅频道channel。

发布:publish channel msg向频道channel 发送一条msg消息。

11.3 发布与订阅命令行实现

  • 打开一个客户端订阅channel 1频道。

高并发核心技术Redis系列(九)--------本地操作相关推荐

  1. 高并发核心技术Redis系列(七)--------Jedis操作Redis

    目录 一.Jedis操作Redis 1.1 Cache Aside Pattern(缓存模式) 1.2 引入Jedis 1.3 常用方法 1. Jedis连接到redis 2. String 3. K ...

  2. Java生鲜电商平台-高并发核心技术订单与库存实战

    Java生鲜电商平台-高并发核心技术订单与库存实战 一. 问题 一件商品只有100个库存,现在有1000或者更多的用户来购买,每个用户计划同时购买1个到几个不等商品. 如何保证库存在高并发的场景下是安 ...

  3. 使用高并发利器redis—解决淘宝/微博的【热门搜索】和【最近搜索】的功能

    推荐以下好文: 详解单体架构 微服务 微服务架构 微服务各个组件 分布式 集群 负载均衡 微服务springcloud环境下基于Netty搭建websocket集群实现服务器消息推送----netty ...

  4. 高并发技巧-redis和本地缓存使用技巧

    在这篇文章中,我主要介绍的是分布式缓存和本地缓存的使用技巧,包括缓存种类介绍,各种的使用场景,以及如何使用,最后再给出实战案例. 众所周知,缓存最主要的目的就是加速访问,缓解数据库压力.最常用的缓存就 ...

  5. 高并发用redis还是mysql_高并发架构系列:Redis缓存和MySQL数据一致性方案详解

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  6. 高并发解决方案——Redis(一)

    简介 Redis作为重要的缓存数据库在高并发的解决方案中起着重要作用.为了系统的学习Redis,也为了秋招(美团比较关注Redis 的掌握),计划编写该系列博客,也是为了整理知识点. 本篇主要介绍了R ...

  7. Java互联网架构-京东国美高并发核心技术“秒杀”

    一丶 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1)低廉价格:(2)大幅推广:(3)瞬时售空:(4) ...

  8. 【高并发】Redis如何助力高并发秒杀系统?看完这篇我彻底懂了!!

    秒杀业务 在电商领域,存在着典型的秒杀业务场景,那何谓秒杀场景呢.简单的来说就是一件商品的购买人数远远大于这件商品的库存,而且这件商品在很短的时间内就会被抢购一空.比如每年的618.双11大促,小米新 ...

  9. 面试杂谈:(高并发)redis和cache的使用场景和区别

    近期公司项目中涉及到了高并发情况的优化,一般来说针对高并发,雷打不动的两种方式就是.1.增加硬件配置:2.优化系统配置 硬件配置包含集群,读写分离,反向代理等等,因为我这边没有涉及到,所以具体内容咱们 ...

最新文章

  1. python基础 while循环练习
  2. django邮箱验证模块
  3. maven 文件上传下载_使用Maven将文件上传和下载到S3
  4. cacti不能实时刷新流量图_介绍一种编码帧内刷新算法
  5. UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 14: illegal multibyte sequence
  6. OpenCV教程(42) xml/yaml文件的读写
  7. 数据库 课程设计 仓库管理系统
  8. 数据结构总结(线性结构,树型结构,图型结构,顺序结构,链式结构)
  9. manjaro i3wm社区版配置记录
  10. 界面原型设计——在线教育app
  11. vs-cad二次开发-C#-拖动类-右键选项卡
  12. No tracked branch configured for branch dev-rongtong or the branch doesn‘t exist.
  13. 5.5leecode刷题记录(leecode704.二分查找,leecode.27移除元素)
  14. 简单的java单位换算_Java实现蓝桥杯单位转换
  15. USACO Section 1.1 Broken Necklace
  16. 【文本文件与二进制文件的区别;文件打开与关闭的方法、不同读写方式】(学习笔记19--文件上)
  17. 文思海辉java怎样_6文思海辉JAVA面试问题
  18. [work] Ubuntu 常用快捷键总结
  19. html怎么添加音乐改大小,给视频添加背景音乐 或者更换音频ppt添加视频文件幻灯片尺寸设置...
  20. BlockChain:2020年7月10日世界人工智能大会WAIC《链智未来 赋能产业区块链主题论坛》(三)

热门文章

  1. 换个花样玩C++(1)步步深入窥探const
  2. windows11,java最详细安装jdk,手把手教你安装jdk,配置环境变量
  3. krita windows编译源码
  4. 如何拥有一个免费云服务器
  5. 超闩锁和子闩锁如何工作的
  6. 直流有刷电机驱动项目需求分析
  7. MiniDao-PE精简版
  8. Linux下的搜狗拼音输入法-fcitx sougopinyin
  9. Linux中不同MTD设备分区,Linux MTD设备总结
  10. 用python批量处理图片尺寸