1.redis String类型的数据类型,是二进制安全的,那么我们如何理解这个二进制安全呢?
http://www.redis.cn/topics/data-types-intro
https://redis.io/topics/data-types-intro
1.String类型:是最简单的一种数据类型,key-value的形式存储,key都是String类型
下面设置如下信息内容:
gaoxinfu年龄:18岁
gaoxinfu性别:男
gaoxinfu收入:10000.10
127.0.0.1:6379> mset gaoxinfu_age 18 gaoxinfu_sex man gaoxinfu_salary 10000.10
OK
127.0.0.1:6379>
set key value [expiration EX seconds|PX milliseconds] [NX|XX]
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379>
127.0.0.1:6379> mset key2 value2 key3 value3
OK
127.0.0.1:6379> get key2
"value2"
127.0.0.1:6379> get key3
"value3"
127.0.0.1:6379>
127.0.0.1:6379> keys *
1) "name2"
2) "salary"
3) "name3"
4) "rename1"
5) "gaoxinfu_sex"
6) "gaoxinfu_age"
7) "key1"
8) "gaoxinfu_salary"
9) "frank_age"
10) "key3"
11) "key2"
127.0.0.1:6379> mget name2 name3
1) "gaoxinfu2"
2) "gaoxinfu3"
127.0.0.1:6379>
由于key:gaoxinfu_age前面已经存在,所以设置的时候没成功,返回了0
127.0.0.1:6379> setnx gaoxinfu_age 19
(integer) 0
127.0.0.1:6379>
新创建的key:frank_age 设置成功
127.0.0.1:6379> setnx frank_age 19
(integer) 1
127.0.0.1:6379>
setnx可以用来作为分布式锁,进行资源的竞争,设置成功即为获得锁;
当然,获取完锁之后,如果要释放需要用del命令
127.0.0.1:6379> del frank_age
(integer) 1
127.0.0.1:6379>
设置10s后过期
127.0.0.1:6379> set name10 gaoxinfu ex 10
OK
127.0.0.1:6379>
10s后去查询,已经不存在
127.0.0.1:6379> get name10
(nil)
127.0.0.1:6379>
127.0.0.1:6379> set name11 gaoxnfu11
OK
127.0.0.1:6379> EXPIRE name11 10
(integer) 1
127.0.0.1:6379>
127.0.0.1:6379> set name12 gaoxinfu12 ex 10 nx
OK
127.0.0.1:6379>
10s后再次查询,已经不存在
127.0.0.1:6379> get name12
(nil)
127.0.0.1:6379>
127.0.0.1:6379> set name13 gaoxinfu13
OK
127.0.0.1:6379> set name13 gaoxinfu13_new ex 10 xx
OK
127.0.0.1:6379>
127.0.0.1:6379> set frank_age 18
OK
127.0.0.1:6379> type frank_age
string
127.0.0.1:6379> dec frank_age
(error) ERR unknown command `dec`, with args beginning with: `frank_age`,
127.0.0.1:6379> decr frank_age
(integer) 17
127.0.0.1:6379> incr frank_age
(integer) 18
127.0.0.1:6379>
127.0.0.1:6379> INCRBY frank_age 10
(integer) 29
127.0.0.1:6379>
127.0.0.1:6379> DECRBY frank_age 2
(integer) 27
127.0.0.1:6379>
127.0.0.1:6379> set salary 1002.6
OK
127.0.0.1:6379> incrbyfloat salary 8.4
"1011"
127.0.0.1:6379>
127.0.0.1:6379> get name2
"gaoxinfu2"
127.0.0.1:6379> APPEND name2 frank
(integer) 14
127.0.0.1:6379> get name2
"gaoxinfu2frank"
127.0.0.1:6379>
127.0.0.1:6379> get name2
"gaoxinfu2frank"
127.0.0.1:6379> getrange name2 9 14
"frank"
127.0.0.1:6379>
其中 9是开始位置,14是结束位置
http://redisdoc.com/string/index.html
1.首先,redis的数据存储通过dictEntry去存储;
typedef struct dictEntry {
void *key; # 这个就是我们的key
union {
void *val; # 这个就是我们的value,但是这里的value是通过redisOject对象(见下面的分析)去存储,
uint64_t u64;
int64_t s64;
double d;
} v;
struct dictEntry *next;# 这个dictEntry是指向下一个dictEntry的引用地址
} dictEntry;
#define OBJ_SHARED_REFCOUNT INT_MAX
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
* LFU data (least significant 8 bits frequency
* and most significant 16 bits access time). */
int refcount;
void *ptr;
} robj;
127.0.0.1:6379> get name1
(nil)
127.0.0.1:6379> get name2
"gaoxinfu2frank"
127.0.0.1:6379> type name2
string
127.0.0.1:6379>
1.关于字节的长度问题,我们这里不做过多介绍,根据不同的变成语言(C语言,Java语言)以及不同字符编码有关系
比如在C语言中:
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
127.0.0.1:6379> set gaoxinfu_age 10
OK
127.0.0.1:6379> type gaoxinfu_age
string
127.0.0.1:6379> object encoding gaoxinfu_age
"int"
127.0.0.1:6379>
127.0.0.1:6379> set name4 gaoxinfu4
OK
127.0.0.1:6379> type name4
string
127.0.0.1:6379> type name4
string
127.0.0.1:6379> object encoding name4
"embstr"
127.0.0.1:6379>
127.0.0.1:6379> set name3 我叫高新富我来自山东临沂非常高兴认识大家,欢迎大家来我的博客学习,谢谢大家
OK
127.0.0.1:6379> type name3
string
127.0.0.1:6379> object encoding name3
"raw"
127.0.0.1:6379>
1.如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。
因此,当空间满时,最久没有访问的数据最先被置换(淘汰)。
1.如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。
因此,当空间满时,最小频率访问的数据最先被淘汰
1.sdshdr5,sdshdr8,sdshdr16,sdshdr32,sdshdr64为不同的SDS存储类型
其中:sdshdr5 已经不用
sdshdr5标示:0-2^5=32byte
sdshdr8表示:2^8=64byte
sdshdr16表示:2^16=64K <---- 2^16=2
sdshdr32表示:2^32=4G
sdshdr64表示:2^64=16G
typedef char *sds;
/* Note: sdshdr5 is never used, we just access the flags byte directly.
* However is here to document the layout of type 5 SDS strings. */
struct __attribute__ ((__packed__)) sdshdr5 {
unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {
uint8_t len; /* used */
uint8_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
uint16_t len; /* used */
uint16_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
uint32_t len; /* used */
uint32_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
uint64_t len; /* used */
uint64_t alloc; /* excluding the header and null terminator */
unsigned char flags; /* 3 lsb of type, 5 unused bits */
char buf[];
};
比如我们的value是“gaoxinfu”,那么buf[] 存储的就是如下的字符:'g','a','o','x','i','n','f','u'
1.直接存储的redis中,后面访问的时候会更快
比如像一些前端界面的缓存数据等等
比如:对象缓存,全页数据缓存
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
1.因为redis是分布式部署的,所以不同的应用服务是可以调用同一个redis请求的,
所以不同的应用服务器可以进行数据共享;
http://redisdoc.com/string/set.html
redis> EXISTS job # job 不存在
(integer) 0
redis> SETNX job "programmer" # job 设置成功
(integer) 1
redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败
(integer) 0
redis> GET job # 没有被覆盖
"programmer"
incrby orderid 20
1.微博点赞数量,或者抽奖数量,文章的阅读数量,都是可以先写写入redis,再写入数据库的
1.可以使用客户访问的ip或者其他信息作为key,存储访问的次数,一旦超了次数,则直接返回不允许访问
https://www.cnblogs.com/break-python/p/5506606.html