Redis是一个开源的key—value型数据库,支持string、list、set、zset(有序集合)和hash类型数据。
String字符串
List列表
Set集合
Hash散列
Zset有序集合
Redis的几种典型用法
1、传统的key-value存储,这个就不用说了吧,所有缓存框架必备的功能
2、hash功能,在传统kv之外,提供了一个类似hashmap的对应关系,一个key可以对应许多hashkey和value,比如存储商品以及购买人的数量上,key为商品id,hashkey为购买人的userID,value为购买的数量
3、list功能,和Java的List类似,push(key,List)这样,某个key对应一个队列,可以存储List数据,这种用法可以用来做简单的任务队列,需要加数据时就push到队列里面,然后消费者用一个1秒的定时任务,去这个队列里面取东西(这个只是简单的任务队列做法,Redis还提供了一种即时的回调,监听机制的消息队列做法,更专业点)
4、Set功能,和Java的Set类似,用法和上面一样,唯一不同的就是数据是不能重复的
5、Sorted Set,也就是zset,member/score功能,member是成员,socre是得分,这种结构通常用于排行榜,member为userID,score为得分,比如说100分,99分这样,用这种数据结构可以根据score来自动排序
6、最后一点就是批量操作啦,常用的有批量和管道,批量操作可以看做是对同一个数据格式的批量操作,比如设置100key,以及对应的value,一个批量动作搞定。管道的范围更大一些,可以看做是无数的操作放到一起执行,比如你要100个kv操作,100个hash操作,100个zset操作,都可以放到一个管道里面
String:
set/get/append/getset/setlen/del
incr/incrby/decr/decrby
setex/setnx/setrange/getrange
mget/mset/msetnx
Set 数据插入
set name zlh --返回值: ok,说明插入成功。如果当前name存在值则覆盖替换原有的value值。
Get 获取数据
get name --返回值: "zlh" ,如果当前key没有value值,则返回null
Append 追加数据
append name is my friend --返回值:"zlh is my friend" ,如果当前key的value有值则附加到原有string后面,如果没有则写入。
redis数据删除
del name
GetSet 获取原有值的同时写入新的值
getset name zlh --返回值:"zlh is my friend",这里返回的是原有name的value值,同时又给name的value设置新值zlh。此时name的值真实值为zlh
get name --返回值:zlh ,因为上面getset给name的value设置值为zlh。
strlen 获取string长度
strlen name --返回值:3,因为name的value值为zlh,故长度为3,如果该key或者value不存在,则返回0。
incr,incrby数据加法计算
incr为+1内置运算,incrby为+n自设n运算
incr name ---返回值:“数据不是整型或数据超出64位有符号整形数据范围” ,由于原有name的value为"zlh",所以不能转换为整型,故报异常。
incr age ----返回值:1,由于不存在age的key与value值,但是默认age为key值为0进行+1运算。
incr age ---返回值:2,由于上一行代码给age赋值为1,这里incr命令进行+1运算,故返回值为2。
incrby age 10 ---返回值:12 ,因为原有age是2,这里+10故为12。
decr,decrby数据减法计算
decr为-1内置运算,decrby为减n自设n运算
decr name --返回值:“数据不是整型或数据超出64位有符号整形数据范围” ,由于原有name的value为"zlh",所以不能转换为整型,故报异常。
decr age --返回自:11,因为原有age的value值为12,这里decr是自减1的意思,故为11。
decrby age 10 --返回值:1,因为原有age为11,这里-10,故为1。
setex 设置value值并设置过期时间(单位秒)
setex sex 20 male ---返回值:ok,设置key为sex的value值为male,缓存的过期时间为20s。
ddl sex ---返回值: 剩余过期时间,0为已过期,-1为永不过期。
get sex ---返回值:male,说明此时为没有过期,当已经过期此处返回数据为null。
setnx 赋值判断原值是否存在,存在不赋值,返回0;不存在才赋值,返回1
setnx name Tom ---返回值:0,因为name的原有value为zlh,存在值则不赋值。
get name ---返回值:zlh,因为有值,故上面赋值为tom失败,返回0。
setnx phone 18501733702 ---返回值:1,赋值成功,因为原来不存在phone的key与value。
get phone ---返回值:18501733702,说明上面的setnx赋值成功。
setrange 字符串替换赋值,从指定位置开始替换
setrange phone 9 123 --返回值:12,12为字符串长度,11位号码变成了12位。因为从第9位开始替换,替换到原有字符串的最后一位还没有替换完毕,所以在最后面添加啦一位设置为3。
get phone ---返回值为:185017337123.
set phone 1 ---这里为了下面说下setrange的其他特性,把电话设置为1.
setrange phone 3 aaa ---返回值为:6,因为原有phone的value值为1,不到三位,用0*00替换2位,所以要添加2为才能替换第三位后面的值为aaa。
get phone ---返回值:1\*00\*00aaa。理解下上面的操作就知道这里为什么是这样的返回值了。
getrange 截取字符串,从下标为n开始截取到n或n+1,类似c#中的substring
set phone 18501733701
getrange phone 1 5 ---返回值:85017,因为getrange是从下标为1开始截取截取到下标为5,这里包含下标为5的值。
getrange phone 0 0 ---返回值:1,从下标为0开始截取,截取到下标为0,包含下标为0。故返回值为1。
getrange phone 10 13 --返回值为:1,此号码下标直到10的11位号码,从10开始截取,截到第13位,后2位不存在忽略,只返回第10位。故返回干净的1。
批量操作修改及读取string数据
mget 批量读取,mset 批量赋值,msetnx 带事务性的赋值,发现有一个key已经存在,所有事务回归,不做赋值处理操作
mset name zlh age 30 ---返回值:ok,这里设置了 key为name和age的value分别为zlh,30
mget name zlh ---返回值:1>zlh 2>30
msetnx name Jim address China ---返回值为:0,没有做任何修改,因为key为那么已存在
mget name address ---返回值:1>zlh 2>null
msetnx address China,hobbies sports --返回值为:1,插入成功
mget address hobbies ---返回值:1>China 2>sports
List 列表
1、redis中的list的基本属性?
List数据结构是链表结构,这意味这无论数据量多大,头尾操作数据还是很快的,list的容量是2的32次方减1个元素,即4294967295个元素数量。
2、为什么使用redis中的list数据类型?
依靠redis内存中操作数据的优势,又提供一些列实用独特的Api操控数据,用着简便,速度又快,又能实现特有的数据特征排序读写,做时间轴数据,评论列表,消息传递等等,又提供简便的分页,读写操作。你用不用。
3、为什么使用消息队列?
举个简单的例子,功能是这样子的,你要呈现页面给用户看,在你呈现页面之前有一个很复杂耗时的运算要操作,但是这个操作不影响页面呈现的数据,也不作为页面呈现的数据。
方案一:运算完,呈现页面。
方案二:把要计算的数据,抛到持久化的消息队列中,不做耗时的运算,直接呈现页面。然后用另外一个程序来对消息队列中的数据单独做运算。
显而易见,方案二是最佳答案,你用不用消息队列。
4、为什么不使用成熟的rabbitmq而使用redis实现的消息队列?
Rabbitmq只关注数据的先进先出,没有数据优先级的概念,假如你想给那个数据来个先处理的特权,那么不好意思,我不支持,但是rabbitmq也可以变通着来处理,就是建立多个队列用程序路由来实现这个特权功能。那么redis实现的消息队列,是可以灵活掌控的,后面做示范。
Redis实现消息队列,并自带优先级功能
1、首先redis中的list是链表结构,具备消息队列中的先进先出特征。
2、从上面的几个高级命令中可以看出,list有几个自带阻塞功能,时间设置为0,可以视为永不休息的监听进程。
lpush/rpush/lpop/rpop
lrange/llen/lindex
lpush,rpush,linsert 数据插入命令:
rpush 向mylist列表中,从右边插入数据
rpush mylist 1 ---结果为:(integer) 1
rpush mylist 2 ---结果为:(integer) 2
rpush mylist 3 ---结果为:(integer) 3
lrange mylist 0 -1 ---lrange命令:查看mylist列表中的数据,0开始位置,-1结束位置,结束位置为-1时,表示列表的最后一个位置,即查看所有。结果为:1> "1" 2> "2" 3> "3"
lpush mylist 0 ---lpush命令:向mylist列表中,从左边插入一条数据为0的数据
lrange mylist 0 -1 ---结果为:1>"0" 2>"1" 3>"2" 4>"3"
linsert mylist after 3 4 ---linsert命令,表达式为linsert key before|after pivot value ;这句命令的意思是在key为mylist的列表中查找值为3的数据,在其后插入一条值为4的数据。
lrange mylist 0 -1 ---结果为:1>"0" 2>"1" 3>"2" 4>"3" 5>"4"
linsert mylist before 0 -1 ---意思是:在key为mylist的列表中查找值为0的数据,在其前插入一条值为-1的数据。
lrange mylist 0 -1 ---结果为:1>"-1" 2>"0" 3>"1" 4>"2" 5>"3" 6>"4"
lisert mylist after 5 8 ---结果为:-1,由于mylist列表不存在值为5的数据,所以不执行任何操作,返回状态值-1。如果key不存在时,返回错误提示。
lrange mylist 0 -1 ---结果为:1>"-1" 2>"0" 3>"1" 4>"2" 5>"3" 6>"4"
删除数据:lpop,rpop
lpop mylist ---lpop命令:从列表中的左边移除一条数据,同时输出被删除的数据,这里输出的结果为-1
lrange mylist 0 -1 ---结果为:1>"0" 2>"1" 3>"2" 4>"3" 5>"4"
rpop mylist ---rpop命令:从列表的右边移除一条数据,同时输出被删除的数据,这里输出的结果为4
lrange mylist 0 -1 ---结果为:1>"0" 2>"1" 3>"2" 4>"3"
ltrim mylist 1 3 ----ltrim命令:保留设定的两个下标区间的值,删除不在其区间的所有值。1为开始保留的下标值,3为结束保留的下标值。
lrange mylist 0 -1 ---结果为:1>"1" 2>"2" 3>"3"
查看数据:lrange,llen,lindex
llen mylist ---llen命令:返回列表的长度,这里mylist只剩下4条数据,故输出结果为4
lindex mylist 3 ---lindex命令:获取给定位置的数据,这里坐标为3的数据是"2",所以结果为2.
修改数据:lset
lset mylist 2 zlh ---lset命令:把下标为2的值设置为zlh,如果下标值超出范围或对一个空list列表进行lset,那么将返回一个错误提示
lrange mylist 0 -1 ---结果为: 1>"1" 2>"2" 3>"zlh"
两个列表A,B,将A列表的尾元素添加到B列表的头元素中,命令:rpoplpush
#这里我有连个列表A数据为{1,2,3} ,B列表数据为{4,5,6}
rpoplpush A B
lrange A ---结果为:1>"1' 2>"2"
lrange B ---结果为:1>"3' 2>"4" 3>"5" 4>"6"
几个带阻塞的高级命令:blpop,brpop,brpoplpush
blpop A 30 ---意思是:A列表有值的话,从左边移除一个数据,如果没有值的话,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长
blpop B30 ---意思是:A列表有值的话,从左边移除一个数据,如果没有值的话,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长
brpoplpush A B 30 ---意思是:将A列表的尾元素添加到B列表的头元素中,如果A列表中有值则插入,如果没值,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长
Set
Set是用哈希表来保持字符串的唯一性,没有先后顺序,不像list一样,可以在首尾增删数据。
sadd/smembers/sismember/srem/
scard/srandmember/spop/smove/sinter
操作单个set的命令
sadd 新增数据,key值相同下的value值不能重复,返回插入的数据个数,key后面可跟多个value值
sadd mySet 1 ---添加key为mySet的set数据值为1,
sadd mySet 2 4 5 ---添加key为mySet的set数据值为2,
smembers 查看set数据集合数据,可以获取全部的元素
smembers mySet ---获取key为mySet的说有set数据值集合
sismember 判断某个key的value中是否存在某个值 ,如果存在返回1,不存在返回0
sismember mySet 3 ---返回值为0,因为myset的set成员中只有1,2没有3
sismember mySet 2 ---返回值为1,因为myset的Set成员中存在2.
srem 删除数据,返回删除个数,key后面可跟多个value值
srem mySet 1 ---删除key为mySet,value为1的数据项。
srem mySet 2 4 ---删除key为mySet,value为2和4的2个数据项。
scard 查看set数据个数,如果不存在返回0
sadd mySet 1 2 3 4 5
scrad mySet ---查看mySet中存在多少个数据项,返回结果为5
srandmember随机查看元素
srandmember mySet ---输出key为mySet的数据项中的随机一个value,
spop 随机删除一个元素,并返回输出删除的数据
spop mySet ----随机从key为mySet的数据集合中删除一条数据,并返回输出删除的数据
scard mySet ---key为mySet的数据集合中的数据个数为4
操作多个set的命令
set除了对一个set中的元素进行增删改查外,还可以对多个set进行操作,比如将一个set的元素移到另外一个set中,计算多个set的并集,交集,差集等操作。
smove 将一个set中的元素移动到另外一个set中
sadd mySet 1 2 3 ----向mySet中添加3条数据 1 2 3
sadd youSet 3 4 5 ----向youSet中添加3条数据 3 4 5
smove youSet mySet 4 ---将youSet中的数据4移除的同时将数据4添加到mySet中
smembers mySet ---结果为:1 2 3 4
smembers youSet ---结果为 3 5
sinter 求交集
sinter mySet youSet ---输出结果为mySet和youSet的交集,输出结果为:3
sunion求并集
sunion mySet youSet ---输出结果为mySet与youSet的并集,输出结果为:1 2 3 4 5
sdiff求差集
sdiff mySet youSet ---输出结果为mySet中youSet不存在的数据,输出结果为:1 2 4
sdiff youSet mySet ---输出结果为youSet中mySet不存在的数据,输出结果为:5
Redis 有序集合(sorted set)/ZSet
redis 127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
zset集合中withscores的作用?
withscores作用是将查询结果中的分数值也带出来。
Zadd:
Zadd 命令用于将一个或多个成员【元素及其分数值】【加入到有序集当中】。
如果某个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上。
分数值可以是整数值或双精度浮点数。
Zadd 命令基本语法如下
ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
redis 127.0.0.1:6379> ZADD salary 2500 jack # 测试数据
(integer) 0
redis 127.0.0.1:6379> ZADD salary 5000 tom
(integer) 0
redis 127.0.0.1:6379> ZADD salary 12000 peter
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 显示整个有序集
1) "jack"
2) "tom"
3) "peter"
redis 127.0.0.1:6379> ZRANGEBYSCORE salary (5000 400000 # 显示工资大于 5000 小于等于 400000 的成员
1) "peter"
Zcard
Zcard 命令用于【计算】集合中【元素的数量】
语法如下:
ZCARD KEY_NAME
返回值
当 key 存在且是有序集类型时,返回有序集的基数。 当 key 不存在时,返回 0 。
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZCARD myzset
(integer) 2
redis>
Zcount
Zcount 命令用于计算有序集合中【指定分数区间】的【成员数量】。
语法如下:
ZCOUNT key min max
Zscore 命令
返回有序集中,成员的分数值。
如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
ZSCORE key member
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 测试数据
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"
redis 127.0.0.1:6379> ZSCORE salary peter # 注意返回值是字符串
"3500"
Zincrby
Zincrby 命令对有序集合中指定成员的分数加上增量 increment
ZINCRBY key increment member
返回值
member 成员的新分数值,以字符串形式表示
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"
Zrange 命令
Zrange 返回有序集中【指定区间内的成员】。
其中成员的【位置按分数值递增(从小到大)来排序】。
具有相同分数值的成员按字典序(lexicographical order )来排列。
如果你需要成员按值递减(从大到小)来排列,请使用 zrevrange 命令。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
ZRANGE key start stop [WITHSCORES]
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 显示整个有序集成员
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"
redis 127.0.0.1:6379> ZRANGE salary 1 2 WITHSCORES # 显示有序集下标区间 1 至 2 的成员
1) "tom"
2) "5000"
3) "boss"
4) "10086"
Zrem 命令
Zrem 命令用于【移除有序集中的一个或多个成员】,不存在的成员将被忽略。
当 key 存在但不是有序集类型时,返回一个错误。
ZREM key member [member ...]
redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"
# 移除单个元素
redis 127.0.0.1:6379> ZREM page_rank google.com
(integer) 1
redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
# 移除多个元素
redis 127.0.0.1:6379> ZREM page_rank baidu.com bing.com
(integer) 2
redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES
(empty list or set)
# 移除不存在元素
redis 127.0.0.1:6379> ZREM page_rank non-exists-element
(integer) 0
Zrangebyscore 命令
Zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员【按分数值递增(从小到大)次序排列】。
具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
redis 127.0.0.1:6379> ZADD salary 2500 jack # 测试数据
(integer) 0
redis 127.0.0.1:6379> ZADD salary 5000 tom
(integer) 0
redis 127.0.0.1:6379> ZADD salary 12000 peter
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 显示整个有序集
1) "jack"
2) "tom"
3) "peter"
redis 127.0.0.1:6379> ZRANGEBYSCORE salary (5000 400000 # 显示工资大于 5000 小于等于 400000 的成员
1) "peter"
Zscan 命令
用于迭代有序集合中的元素(包括元素成员和元素分值)
redis 127.0.0.1:6379> ZSCAN key cursor [MATCH pattern] [COUNT count]
cursor - 游标。
pattern - 匹配的模式。
count - 指定从数据集里返回多少元素,默认值为 10 。
返回值
返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。
实例
> ZADD site 1 "Google" 2 "Runoob" 3 "Taobao" 4 "Weibo"
(integer) 4
> ZSCAN site 0 match "R*"
1) "0"
2) 1) "Runoob"
2) 2.0
Hash:
数组是通过索引快速定位到指定元素的,无论是访问数组的第一个元素还是最后一个元素,所耗费的时间都是一样的,但是数组中的索引却没有实际意义,他只是一个位置而已。而我们在查找某个元素时,一般都会使用有意义的字段来做索引,这就产生啦dictionary。其实dictionary的实现,就是让key跟下标索引有一定的关系.
hash 是一个string类型的field和value的映射表,hash特别适合 存储对象。
hset key field value 可以理解key为对象名 field为属性 value为属性值
hget key field 获取指定key的field的值
hmset key field1 value1 field2 value2 为指定的key设置多个field及其值
hmget key field1 field2 获取指定key的field1和field2的值
hkeys key 获取指定key的所有的field
hvals key 获取指定key的所有的field的值
hdel key field1 [field2] 删除指定key的一个或多个field
hexists key field 检查指定的key的field是否存在,如果存在返回1,如果不存在返回0
hgetall key 返回指定key的所有的field和field的value.
hlen key 返回指定key的field的个数
del key
hset/hsetnx/hget/hdel
添加命令hset,如果key不存在,创建key,存在,则覆盖原有值
hset myhash name Jim ----给key为myset的键值设置键为name值为Jim
查看命令hget
hget myhash name ----输出: "Jim",获取key为myset,键为name的value
hset myhash name zlh ----覆盖原有值,值改为zlh替换Jim
hget myhash name ---输出:"zlh"
获取key包含的field数量的命令hlen
hset myhash age 31 --- 设置key为myset键为age的value=31
hlen myhash ---输出为2,key为myset的field数量为2
判断指定key中指定field是否存在的命令 hexists,存在返回1,不存在返回0
hexists myhash name ---返回1,说明存在
hexists myhash name1 ---返回0,说明不存在
删除命令hdel,删除一个或多个指定的字段
hset myhash sex nan ----添加数据
hset myhash issingle yes ----添加数据
hset myhash hobby sports ----添加数据
hdel myhash hobby ----删除单个数据,filed为hobby的数据
hdel myhash issingle sex ---删除多个数据,filed为issingle和sex的两条数据
如果key或field不存在插入有效,否则不采取操作的命令 hsetnx
hsetnx myhash sex nan ---设置myhash,field为sex的value为nan,成功返回1,因为原来不存在sex这个字段
hsetnx myhash sex nv ---设置myhash,field为sex的value为nv,不成功返回0,因为原来存在sex这个字段并且有值
hget myhash sex --输出"nan"
操作增减的命令hincrby
del myhash ---删除该键
hset myhash age 31 ---设置key为myhash的键为age值为31
hincrby myhash age 10 ---给key为myhash,键为age的值加10,输出结果为41
hincrby myhash age -10 ---给key为myhash,键为age的值减去10,输出结果为31
相关推荐
在这个项目中,我们需要了解基本的数据类型(如字符串、数字、布尔值等)、变量、控制流(if语句、for循环、while循环)、函数以及对象。 2. **DOM操作**:由于这是一个前端应用,JavaScript将被用来操纵DOM...
在`redit.php`文件中,接收GET数据使用`$_GET`数组: ```php $username = $_GET['username']; $email = $_GET['email']; echo "用户名:". $username . " "; echo "邮箱:". $email; ?> ``` 与`$_POST`类似,...
1. **redit.aps**: 这是一个工程文件,用于在Visual Studio等开发环境中构建和管理项目。它包含了项目设置,如编译选项、链接器设置以及依赖项,使得开发者能够编译和调试注册表编辑器的源代码。 2. **redit.clw**:...
轻量级Reddit克隆在此项目中,我们将构建支持链接提交和评论所需的数据结构。 该项目不包括对前端的要求。 我们将使用Rails控制台来强化使用模型的技能,而不会产生HTTP请求以及涉及控制器或视图的开销。建于Ruby on...
7. **redit.cpp、reditDoc.cpp**:可能包含了主程序的入口点和文档类的实现,文档类在MFC(Microsoft Foundation Classes)框架中用于存储和管理数据。 通过分析和学习这些源代码,开发者可以了解WinCE注册表操作的...
在Windows CE操作系统中,注册表扮演着至关重要的角色,它存储了系统配置、应用程序设置以及设备驱动信息等关键数据。Windows CE(Windows Embedded Compact)是一个轻量级的嵌入式操作系统,广泛应用于移动设备和...
- `DlgData.cpp`, `MainFrm.cpp`, `redit.cpp`, `reditDoc.cpp`:这些文件包含了对话框数据、主框架和文档类的实现,它们构成了应用程序的基本架构。 - `DlgAddValue.cpp`, `DlgRenameKey.cpp`:添加值对话框和...
由于WinCE是精简版的操作系统,其注册表结构可能比传统的Windows桌面系统更为简洁,但功能同样强大。`wince_gprs_reg`标签暗示了该压缩包可能包含用于配置GPRS(通用分组无线业务)连接的特定注册表设置。GPRS是一种...
### 网上选课系统数据库设计解析 ...此外,通过对每个表中的字段进行严格的约束设置,确保了数据的一致性和准确性。对于初学者而言,这是一个很好的学习案例,有助于深入理解数据库设计的基本原则和技术要点。