当前位置: 首页 > news >正文

校园网站建设整改建议网站目录结构构建的原则是以

校园网站建设整改建议,网站目录结构构建的原则是以,企业网站那几点重要,石家庄企业名录大全redis数据结构 redis全名(Remote Dictionary Server)#xff0c;即远程字典服务 redis的值的数据结构类型有String、List、Set、Hash、zset(sorted set#xff0c;有序集合)、Bitmaps(位图)、HyperLogLogs 注意#xff1a;我使用的版本是6.0.10#xff0c;不同版本可能略有… redis数据结构 redis全名(Remote Dictionary Server)即远程字典服务 redis的值的数据结构类型有String、List、Set、Hash、zset(sorted set有序集合)、Bitmaps(位图)、HyperLogLogs 注意我使用的版本是6.0.10不同版本可能略有差别 redis中key的最大长度为512M 对象 server.h 任何value对象都会被包装成一个redisObjectredisObject能指定value类型编码方式等数据属性 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; 类型总览 redis中的数据类型即为redisObject的type属性 // string#define OBJ_STRING 0    /* String object. */// list#define OBJ_LIST 1      /* List object. */// set#define OBJ_SET 2       /* Set object. *///zset#define OBJ_ZSET 3      /* Sorted set object. *///hash#define OBJ_HASH 4      /* Hash object. */// module#define OBJ_MODULE 5    /* Module object. */// stream#define OBJ_STREAM 6    /* Stream object. */ #可以使用type命令来查看该键所对应值的类型type key redis的编码分类 对应于redisObject的ecoding属性encoding是决定对象底层实现数据结构的 // 简单动态字符串  raw#define OBJ_ENCODING_RAW 0     /* Raw representation */// long类型的整数 int#define OBJ_ENCODING_INT 1     /* Encoded as integer */// 哈希表  hashtable#define OBJ_ENCODING_HT 2      /* Encoded as hash table */// 压缩  不再使用#define OBJ_ENCODING_ZIPMAP 3  /* Encoded as zipmap */// 双向链表  不再使用该结构#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */// 压缩列表  ziplist#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */// 整数集合  intset#define OBJ_ENCODING_INTSET 6  /* Encoded as intset */// 跳表  skiplist#define OBJ_ENCODING_SKIPLIST 7  /* Encoded as skiplist */// embstr编码的简单动态字符串  embstr#define OBJ_ENCODING_EMBSTR 8  /* Embedded sds string encoding */// 快表  quicklist#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */// 流  stream#define OBJ_ENCODING_STREAM 10 /* Encoded as a radix tree of listpacks */ 可以使用命令来查看存储方式 object encoding key 来查看该key使用的是哪种编码 127.0.0.1:6379 set test_int 1OK127.0.0.1:6379 object encoding test_intint127.0.0.1:6379 set test_raw zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzOK127.0.0.1:6379 strlen test_raw(integer) 44127.0.0.1:6379 object encoding test_rawembstr127.0.0.1:6379 set test_raw zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzOK127.0.0.1:6379 object encoding test_rawraw127.0.0.1:6379 strlen test_raw(integer) 45# 查看key的内部结构和编码等信息   debug object k4  Value at:0x7ffc97c044f0 refcount:1 encoding:embstr serializedlength:3 lru:11351195 lru_seconds_idle:5363 String类型 string类型属于单值单value是一个可变的字节数组就像StringBuilder似的可以追加、获取长度、截取等操作 扩容当字符串长度小于1M时扩容是现有空间进行加倍当字符串长度超过1M扩容只会多扩1M的空间。且字符串最长为512M 源码结构 sds.h其内部使用的是SDS简单动态字符串保存了长度信息获取字符串长度只需要O(1) struct __attribute__ ((__packed__)) sdshdr5 {   // 存储了字符串的类型和长度3位存类型5位存长度    unsigned char flags; /* 3 lsb of type, and 5 msb of string length */    char buf[];};// 暂时应该是没有用到5的只用到了8、16、32、64struct __attribute__ ((__packed__)) sdshdr8 {  // header中进行存储len、alloc、flags  // 当前使用空间大小即字符串的长度    uint8_t len; /* used */  // 去掉header和结尾空字符后的最大空间    uint8_t alloc; /* excluding the header and null terminator */  // 8位的标记3位存类型5位没有使用    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[];}; 编码格式 编码对象OBJ_ENCODING_INT使用整数值实现的字符串对象OBJ_ENCODING_EMBSTR使用embstr编码的简单动态字符串实现的字符串对象OBJ_ENCODING_RAW使用简单动态字符串实现的字符串对象 string有三种编码格式 int 整数值 embstr 用于存储短字符串的编码方式字符串长度小于等于44字节使用数据保存在一块连续的内存里 raw 字符串值长度大于44字节使用 embstr和raw两种编码的区别 embstr编码用于保存短字符串与raw编码一样都是使用redisObject结构和sdshdr结构来表示字符串对象,但是raw编码会调用两次内存分配函数来分别创建redisObject结构和sdshdr结构而embstr编码则通过调用一次内存分配函数来分配一块连续的内存空间空间中依次包含redisObject和sdshdr两个结构 操作命令 值拼接 #给key对应的value进行拼接返回的是拼接之后的字符长度append k1 qwe(integer) 5 值长度 strlen k1 数字运算操作 #加一INCR k2#减一DECR k2#加3第二个参数是步长INCRBY k2 3#减2第二个参数是步长DECRBY k2 2 注意这几个命令只能对数字进行操作范围是Long.MIN~Long.MAX 获取值 get k1#只获取该key所对应value的部分字符getrange k1 0 2 判断值是否存在 # 返回0则为不存在exists test 设置值 # set key valueset test 123# setrange覆盖部分值  其中0为从下标为0的字符开始替换setrange k1 0 zx(integer) 5#设置值时设置过期时间#setex key seconds valuesetex k3 20 b#如果key不存在设置值,防止覆盖(set if not exists)#setnx key valuesetnx k1 1# 设置key的值并返回key的旧值getset k1 vv1 多值操作 #同时set多个键值#mset key value [key value ...]mset k4 v4 k5 v5#同时获取多个键的值#mget key  [key ...]mget k4 k5 #同时set多个键值(全部不存在时才会设置值)#msetnx key value [key value ...]msetnx k6 v6 k7 k8 List类型 List属于单值多value链表用的是双向链表结构list支持pop、push来操作头部和尾部既可以用做栈也可以用做队列 在3.2版本之前使用的是ziplist和linkedlist在3.2版本之后使用的是quicklist 源码结构 quicklist结构 typedef struct quicklist {    quicklistNode *head;    quicklistNode *tail;    unsigned long count;        /* total count of all entries in all ziplists */    unsigned long len;          /* number of quicklistNodes */    int fill : QL_FILL_BITS;              /* fill factor for individual nodes */    unsigned int compress : QL_COMP_BITS; /* depth of end nodes not to compress;0off */    unsigned int bookmark_count: QL_BM_BITS;    quicklistBookmark bookmarks[];} quicklist;typedef struct quicklistNode {    struct quicklistNode *prev;    struct quicklistNode *next;    unsigned char *zl; // 对应的是ziplist    unsigned int sz;             /* ziplist size in bytes */    unsigned int count : 16;     /* count of items in ziplist */    unsigned int encoding : 2;   /* RAW1 or LZF2 */    unsigned int container : 2;  /* NONE1 or ZIPLIST2 */    unsigned int recompress : 1; /* was this node previous compressed? */    unsigned int attempted_compress : 1; /* node cant compress; too small */    unsigned int extra : 10; /* more bits to steal for future usage */} quicklistNode; ziplist结构 压缩的双链表以连续的空间来表示双链表节省前驱和后继指针的空间在小的list上压缩效率明显因为在普通的双链表中前驱和后继指针在64位机器上分别占用8B在ziplist.h和ziplist.c中定义 typedef struct zlentry {    unsigned int prevrawlensize; /* Bytes used to encode the previous entry len*/    unsigned int prevrawlen;     /* Previous entry len. */    unsigned int lensize;        /* Bytes used to encode this entry type/len.                                    For example strings have a 1, 2 or 5 bytes                                    header. Integers always use a single byte.*/    unsigned int len;            /* Bytes used to represent the actual entry.                                    For strings this is just the string length                                    while for integers it is 1, 2, 3, 4, 8 or                                    0 (for 4 bit immediate) depending on the                                    number range. */    unsigned int headersize;     /* prevrawlensize  lensize. */    unsigned char encoding;      /* Set to ZIP_STR_* or ZIP_INT_* depending on                                    the entry encoding. However for 4 bits                                    immediate integers this can assume a range                                    of values and must be range-checked. */    unsigned char *p;            /* Pointer to the very start of the entry, that                                    is, this points to prev-entry-len field. */} zlentry;typedef struct {    /* When string is used, it is provided with the length (slen). */    unsigned char *sval;    unsigned int slen;    /* When integer is used, sval is NULL, and lval holds the value. */    long long lval;} ziplistEntry; 而对于quicklist编码的定义是 OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */ 操作命令 设置值 #lpush(指从左边进头部先进后出像栈)#lpush key element [element ...]lpush list1 1 2 3 4 5#rpush(指从右边进尾部先进先出像队列)#rpush key element [element ...]rpush list2 1 2 3 4 5#给某个索引位置赋值#lset key index elementlset list1 0 q#在某个元素之前或之后插入一个元素#linsert key before|after pivot elementlinsert list1 before q zz# 获取指定索引的元素如果使用负数则从右边开始计算lindex list1 0 取值 #弹出栈顶元素(从左边开始弹出弹出之后list中就不存在该元素了)#lpop key lpop list1#弹出栈顶元素(从右边开始弹出弹出之后list中就不存在该元素了)#rpop key rpop list1#按照索引位置取值#lindex key indexlindex list1 0#取值从头部到尾部#lrange key start end   (负下标表示的是从后往前如-1表示倒数第一)lrange list1 0 -11) 52) 43) 34) 25) 1# blpop和brpop是阻塞版本# blpop key timeout# timeout表示 列表为空时会等3秒后返回如果timeout0则会一直阻塞下去直到有数据为止# 如果多个客户端对同一个键执行blpop那么先执行的blpop命令的客户端可以获取到弹出的值blpop list1 3 列表长度 llen list1 删除值 #删除几个某个元素  count0时从左边开始删除count0时删除所有值为element的元素count0时从右边开始删除#lrem key count elementlrem list1 1 hi#截取指定范围的值赋给key(范围是索引)#ltrim key start stopltrim list1 0 0# 从头部删除元素  出栈lpop list1# 从尾部删除元素rpop list1 出栈入栈 #从源列表右出栈压入左目标列表将一个列表移至另一个列表#rpoplpush source destrpoplpush list2 list1 Set类型 set类型是单值多value与List的区别在于不可重复且没有顺序类似于HashSet通过hash table实现的 set除了基本的增删改查操作之外还可以使用集合来取并集、交集、差集可以用来实现好友推荐等功能 编码格式 编码对象OBJ_ENCODING_INTSET使用整数集合实现的集合对象OBJ_ENCODING_HT使用的hash table set有两种编码格式 intset 保存的元素全都是整数且元素数量不超过512 hash table 保存的不是整数 #根据该配置项来进行编码转换的set-max-intset-entries 512 源码结构 intset结构 整数集合 typedef struct intset {  // 每个整数的类型    uint32_t encoding;  // intset的长度    uint32_t length;  // 整数数组    int8_t contents[];} intset; 操作命令 设置值 #设置值#sadd key member [member ...]sadd set1 vv vc vb vv 取值 #取值,集合中的所有元素#smembers keysmembers set11) vc2) vb3) vv#判断该元素是否在set中#sismember key membersismember set1 vv#获取随机的元素,不会删除元素(count表示获取的数量默认为1)#srandmember key [count]srandmember set1 2 查看集合元素个数 #scard keyscard set1 删除 #srem key member [member ...]srem set1 vb#随机出栈(默认数量为1)#spop key [count]spop set1 随机抽取 #随机从集合中抽取2个(默认1个)#srandmember key [count]srandmember set1 2 #将源集合中的值移至目标集合#smove source dest membersmove set1 set2 test 差集 交集 并集  #差集 返回的是其他key与第一个key的差集属于A且不属于B的(A - B) #sdiff key [key ...] sdiff set1 set2  #交集  属于A且属于B的(A ∩ B) #sinter key [key ...] sinter set1 set2 #并集  属于A或属于B的(A ∪ B) #sunion key [key ...] sunion set1 set2 Hash类型 value是键值对相当于HashMap对于hash碰撞也是采用的HashMap的处理方式数组链表 更适合存储对象将一个对象存储在hash类型中会占用更少的内存且可以更方便的存取整个对象 编码格式 编码对象OBJ_ENCODING_ZIPLIST使用ziplistOBJ_ENCODING_HT使用的hash table hash有两种编码格式当键值对数据量比较小时使用紧凑的数组格式来节省内存空间 ziplist 一开始存储使用的ziplist但是当满足一定条件时会转换为hash table hash table #根据该配置项来进行编码转换的# 当hash对象的键值对数量大于该值时使用OBJ_ENCODING_HT编码 hash-max-ziplist-entries 512# 当hash对象中的键值对存在键或值的长度大于该值时使用OBJ_ENCODING_HT编码 hash-max-ziplist-value 64 源码结构 dict.h // 哈希表结构typedef struct dictht {   // 哈希表数组    dictEntry **table;   // 哈希表大小    unsigned long size;   // 哈希表大小掩码用于计算索引值    unsigned long sizemask;   // 哈希表已有节点数量    unsigned long used;} dictht;// 哈希节点typedef struct dictEntry {   // 键    void *key;   // 值    union {        void *val;        uint64_t u64;        int64_t s64;        double d;    } v;   // 下一个哈希节点链表可以将多个哈希值相同的键值对进行连接解决hash冲突的问题    struct dictEntry *next;} dictEntry;// 字典结构typedef struct dict {   // 类型    dictType *type;   // 私有数据    void *privdata;   // 哈希表   // ht[0]:用来存放真实的数据   // ht[1]:用于扩容    dictht ht[2];   //rehash 如果为-1表示没有进行rehash    long rehashidx; /* rehashing not in progress if rehashidx  -1 */    int16_t pauserehash; /* If 0 rehashing is paused (0 indicates coding error) */} dict;// 处处不同的数据结构使用不同的hash算法不同的键值比较算法不同的析构函数typedef struct dictType {   // hash函数    uint64_t (*hashFunction)(const void *key);    void *(*keyDup)(void *privdata, const void *key);    void *(*valDup)(void *privdata, const void *obj);   // 比较函数    int (*keyCompare)(void *privdata, const void *key1, const void *key2);  // 键值析构函数    void (*keyDestructor)(void *privdata, void *key);    void (*valDestructor)(void *privdata, void *obj);    int (*expandAllowed)(size_t moreMem, double usedRatio);} dictType; 哈希冲突 redis哈希冲突是使用链地址法进行解决的将新节点添加在链表的表头 扩容 redis的字典源码中的dictht是一个容量为2的数组其作用就是用于进行扩容的  // 哈希表   // ht[0]:用来存放真实的数据   // ht[1]:用于扩容    dictht ht[2]; 最初始的数据是存放在ht[0]中的当要进行扩展或收缩时ht[1]会根据ht[0]的容量来计算容量ht[1]扩展的大小是比当前ht[0].used值的两倍大的第一个2的整数幂收缩的大小是ht[0].used的第一个大于等于的2的整数幂。然后将ht[0]的所有键值重新散列到ht[1]中重新计算所有的数组下标当数据迁移完后ht[0]就会释放然后将ht[1]改为ht[0]为下一次扩展或收缩做准备 由于有时候redis中的数据比较多不能瞬间完成扩容操作会将rehash操作进行分步进行其字段rehashidx就用于标识rehash过程如果是-1表示当前没有进行rehash操作当进行rehash操作时会将该值改为0在进行更新、删除、查询操作时会在ht[0]和ht[1]中都进行先更新ht[0]在更新ht[1]而进行新增操作就直接新增到ht[1]中保证ht[0]只减不增直到rehash完成 操作命令 设置值 #Redis4.0之后可以设置多个值与hmset功能相同#hset key field value [field value ...]# 不区分插入和更新插入时返回1更新时返回0hset user id 123#设置多个字段#hmset key field value [field value ...]hmset user name zhangsan age 18#不存在则设置值#hsetnx key field valuehsetnx user id 12 获取值 #hget key fieldhget user id#获取多个字段的值#hmget key field [field ...]hmget user id name sex age#可以获取该key所对应的map#hgetall keyhgetall user#获取key对应的map有几个字段#hlen keyhlen user#判断该key的某个字段是否存在#hexists key fieldhexists user id#获取该key下所有的字段#hkeys keyhkeys user#获取该key下所有的字段值#hvals key hvals user 删除字段值 #支持删除多个字段#hdel key field [field ...]hdel user age 数值操作 # 加2# hincrby key field incrementhincrby user id 2# 减2# hdecrby key field incrementhdecrby user id 2 Zset类型 zset是sorted set即有序的集合在set的基础上加了一个score类似于TreeSet使用score来进行排序也可以根据score的范围来获取元素的列表 原本set值为k1 v1 k2 v2而zset是k1 score1 v1 k2 score2 v2 底层使用的是dict哈希表和skiplist跳表dict用来关联value和score保证value的唯一性同时通过value可以获取到score。skiplist的作用在于给value排序以及根据score的范围来获取元素列表 编码格式 编码对象OBJ_ENCODING_ZIPLIST使用ziplistOBJ_ENCODING_SKIPLIST使用的skiplist zset有两种编码格式 ziplist 满足条件使用ziplist否则使用skiplist skiplist #根据该配置项来进行编码转换的zset-max-ziplist-entries 128zset-max-ziplist-value 64 源码结构 跳表skiplist相比一般的链表有更高的查找效率效率可以比拟二叉查找树 跳表搜索 在存储时会预先间隔地保存了有序链表的节点从而在查找时能达到类似于二分搜索的效果可以节省查找时间但是浪费了空间数据只存储了一次只是指针多次存储了 由多层结构组成 每一层都是一个有序链表 最底层的链表包含了所有元素 如果一个元素出现在leveli的链表中则它在leveli之下的链表也都会出现 每个节点包含两个指针一个指向同链表中的下一个元素一个指向下面一层的元素 typedef struct zset {   // 哈希表    dict *dict;  // 跳表    zskiplist *zsl;} zset;typedef struct zskiplistNode {  // 节点数据    sds ele;  // 分数    double score;  // 后继指针    struct zskiplistNode *backward;  // 前驱指针    struct zskiplistLevel {        struct zskiplistNode *forward;      // 调到下一个数据项需要走几步计算rank时有用        unsigned long span;    } level[];} zskiplistNode;typedef struct zskiplist {  // 跳表头尾指针    struct zskiplistNode *header, *tail;  // 跳表长度    unsigned long length;  // 跳表高度    int level;} zskiplist; 操作命令 设置值 # 向zset中添加元素并且会根据score进行排序如果元素存在会更新score#zadd key score member [score member ...]zadd zset1 1 q 2 w 取值 #WITHSCORES表示查询结果是否带着scorescore从小到大#zrange key start stop [WITHSCORES]zrange zset1 0 -1#WITHSCORES表示查询结果是否带着scorescore从大到小#zrevrange key start stop [WITHSCORES]zrevrange zset1 0 -1#根据score范围查询#zrangebyscore key min max [WITHSCORES] [LIMIT offset count]zrangebyscore zset2 80 100#根据score的范围来计数#zcount key min max zcount zset2 0 10  #根据值来获取下标(根据score从小到大来排的序) #zrank key member zrank zset2 d  #根据值来获取下标(根据score从大到小来排的序) #zrevrank key member zrevrank zset2 d  #获取元素的score #zscore key member zscore zset2 c  查看集合元素个数 #该key的元素个数zcard zset2 删除 #zrem key memberzrem zset2 s# 根据下标区间来删除(根据score从小到大来排的序)#zremrangebyrank key start stopzremrangebyrank zset1 5 8# 根据score区间来删除# zremrangebyscore key min maxzremrangebyscore zset1 7 10 数值操作 # 如果key中存在该元素则该元素的score增加increment否则新增该元素# zincrby key increment memberzincrby zset1 2 b Bitmap类型 位图不是一个真实的数据类型是定义在字符串类型之上的面向位操作的集合每个单元只能存储0和1。位图的最大优势在于节省空间 127.0.0.1:6379 type bitteststring 设置值 #setbit key offset value# value只能是0或者1setbit bittest 10 1 取值 #getbit key offset# 如果offset超出范围的话返回0getbit bittest 10#bitcount key [start] [end]#获取指定范围为1的个数bitcount bittest 0 1000 bitmap适用于大量数据少量数据的话会导致大部分位都是0占用的内存数比集合还多 HyperLogLog类型 HyperLogLog是一种基于字符串类型的基数算法。通过HyperLogLog可以利用极小的内存空间完成独立总数的统计 127.0.0.1:6379 type hplstring # 添加# pfadd key element [element ...]pfadd hpl 123# 统计# pfcount key [key ...]pfcount hpl#合并# pfmerge destkey sourcekey [sourcekey ...]pfmerge destkey sourcekey1 sourcekey2 HyperLogLog非常的节省空间但是HyperLogLog统计的数据是不准确的 GEO类型 地理信息定位功能支持存储地理位置信息。其底层是zset 127.0.0.1:6379 type keyzset # 增加地理位置信息# longitude经度# latitude纬度# member成员# geoadd key longitude latitude member [longitude latitude member ...]geoadd key 116.28 39.55 bj# 获取地理位置信息 返回经纬度#geopos key member [member ...]geopos key bj# 获取两个地理位置的距离 unit为单位 包含 m 米、km 千米、mi 英里、ft 尺# geodist key member1 member2 [unit]geodist key bj sjz km# 获取指定位置范围内的地理信息集合# georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]# longitude latitude也可以使用成员来替换,此时使用georadiusbymember key member# radius m|km|ft|mi 表示半径单位# withcoord 返回结果中包含经纬度# withdist 返回结果中包含里节点位置的距离# withhash 返回结果中包含geohash# COUNT count 指定返回的数量# asc|desc 按照距离做升序或者降序# store key 将返回结果的地理位置信息保存到指定键# storedist key 将返回结果距离节点距离保存到指定键georadiusbymember key bj 250 km# 删除地理位置信息# zrem key member 各个类型的场景 String: 缓存 set key value 分布式锁 setnx key value 限流/计数器 INCR count DECR count 分布式id 使用INCR来生成id INCR id pv/uv统计 可以使用incr来统计文章的访问量key设置为post:文章ID:view 分布式session List: 消息队列 LPUSH list item brpop list来实现阻塞队列 评论 热点列表 如微博话题 LRANGE list 0 10 lpushlpop 栈 lpushrpop 队列 lpushltrim 有限集合 lpushbrpop 消息队列 Set: 点赞、标签 标签 文章标签很多每个人喜好也很多推送的时候使用交集 SINTER set1 set2 set3 Hash: 存储对象 Zset: 排行榜 ZADD 添加元素 ZRANGE 按分数从低到高排列返回区间内的元素 ZREVRANGE 按分数从高到低排列返回区间内的元素 ZRANK 返回某个元素的排名 Bitmap 可以用来做布隆过滤器 可以用来统计每天的用户数 HyperLogLog 可以用来计算独立总数但是不可以获取用户id(而且数据存在一定的误差) GEO 可以用来做附近位置等依赖于地理位置的功能 https://zhhll.icu/2021/数据库/非关系型数据库/redis/基础/7.redis数据结构/ 本文由 mdnice 多平台发布
http://www.zqtcl.cn/news/313017/

相关文章:

  • 平湖网站改版洛卡博网站谁做的
  • 买卖平台有哪些网站三航奔腾建设有限公司官方网站
  • 网站建设的企业wordpress teamtalk
  • 公司起名字大全免费查询网站的哪些标签需要优化
  • 装修公司手机网站模板网络营销品牌有哪些
  • 如何保证网站安全在线的crm系统软件
  • 网站名称与主体性质不符wordpress首页锚点
  • 有口碑的常州网站建设传统网站建设
  • 大学网站建设排名金乡网站建设
  • 手机网站开发步骤徐州网站制作怎么做
  • 南通网站优化找哪家推荐做素菜的网站
  • 中国十大网站域名界面设计最好的网站
  • 苍山做网站北京便宜网站建设
  • 广州公司网站制作招聘信息汕头网站推广哪家好
  • 登录建设官方网站品牌营销专家
  • 天津模板建站哪家好wordpress标题换行显示不全
  • 杭州房地产网站建设网站建设开发公司推荐指数
  • 建设部网站上怎样查询企业业绩做淘宝联盟网站要多少钱
  • 宣武上海网站建设网站导购话术
  • 天津北京网站建设公司大网站建设公司
  • 网站需要在哪些方面备案百度云建网站
  • 西安手机网站定制网站建设西安网站注册
  • 怎么做秒赞网站企业自己建设的营销网络
  • 一般网站建设需求有哪些wordpress脚注更改
  • 海报设计在线生成免费网站排名优化方案
  • 网站开发综合设计报告怎么制作浏览器网页
  • 做网站打广告青岛网站营销推广
  • 网站建设中首页模板本科 网站建设的基础教程
  • 推广网站优化seo教程上排名抖音营销
  • 创业园区网站建设wordpress对接公众号源码