计数功能
企业愿意去收集用户的数据,从而使用大数据推广->明确你的需求->根据需求改进产品和迭代产品。
Redis其实并不擅长技术统计,而这种操作应该去找mysql,
获取之后,用异步的方式同步到数据库(但是这也面临非常多的挑战,比如作弊找水军,点赞,收藏,转发)
这就需要用到数据持久化
Session(会话)->服务器用于跟踪和存储关于用户会话信息的机制(比如说我们的火影服务器,来存储你有多少忍者,多少高招卷,多少时装啥的)
Cookie->客户端的浏览器存储数据的一种机制,(记录用户状态,cookie会被浏览器保存起来,下次再次放送请求的时候,就会把该请求相关的Cookie添加到请求头中(类似于你登陆了csdn,还是这个浏览器,下次登陆的时候,就无须登陆了再)
Hash-哈希(Redis本来就是键值对结构,哈希,就相当于键值对嵌套了一个键值对)的多种指令
我们可以发现多了一个field,这是为了区分前面的key
Hset key field value-设置字段field的value
Hget key field value-获取字段key field的value
hexists key field-判断当前值是否存在(1存在,0不存在)
hdel key field-删除key的field
HKEYS key-获取hash中所有字段key(会根据key找到对应的hash)a
这里面我们可以发现一个问题:我们查找key的时候,他两个是在一起的,那就说明哈希表的储存结构,是两个字段相互独立的存储在同一个哈希结构中,他们各自相互独立存在,相互之间没有什么联系,但是他们两个还是在相同的一个key中,就像是dp[x][x]->
dp[0][0 ],dp[0][1],都是在dp[0][x]里面,但是两者没有相关联系。
HGETALL key(获取所有的field和value)
HMGET key field[field]-,可以一次查询多个field,类似于之前的HGET,HGET一次能查一个field.
Hlen key-查找当前哈希元素
HSETNX key field value-不存在当前值的时候,才会设置成功,如果存在,则会设置失败
Hscan key
为啥没有HMSET,因为Hset已经支持了多个field,上述Hkeys,hgetall,都存在一定风险,hash元素执行太多,执行表耗时太多,从而会阻塞redis,hscan遍历redis的hash,但是他是"渐进式遍历",一次一小部分,连续多次就可以完成整个遍历过程。
ConcurrentHashMap线程安全的哈希表(类似于这个哈希表在扩容的时候,也是化整为零)
hash这里的value也可以当做整数来处理
hincrby key field value-对于value加减整数
Hincrbyfloat key field value-可以加减小数
哈希的内部编码:
压缩链表 ziplist目的是为了节省空间。
代价:读写元素,比较慢,但是元素的个数一般比较少,慢的不明显。
元素个数
hash-max-ziplist-value(默认64字节长度)
hash-max-ziplist-entries配置里面有(默认是512个,当元素超过多少,换成hashtable)
object encoding key-查看内部编码
作为缓存 -String也是作为缓存来使用的,存储结构化时候,使用hash类型更好。上述使用string类型也能做
方式2
1. id age city 2. user1 1 11 Shenyang 3. user2 2 12 Xian
如果使用String(JSON)的格式来去存储这种结构,万一我们只想获取某个field或者修改field,就需要把整个JSON读出来,解析对象,再去重写JSON字符,再去写回去
方式3
如果我们使用hash表示这种结构,就可以使用field来表示对象的每个属性(数据表的每个列),此时就可以修改/获取任何一个属性的值
使用hash的方式,读写field更加高效,但是会付出空间的待见
,需要控制内部ziplist和hashtable两种内部编码的转换,可能造成内存较大消耗
user1 uid 1 age1 user2 uid 1 age2
set user:1name jam
set user:2:age 23
set user:2:city shenyang 追求高内聚-低耦合(但是这个又过于分散)
高内聚:有关联的东西,放到指定的地方
耦合:两个模版/代码之间关联关系,关联关系越大,越容易相互影响,认为耦合性越大
关系型数据库可以做复杂的关系查询,而用Redis去模拟关系型数据库型复杂查询,但是你要是连表,聚合,那还是算了
这个uid不存储可以吗?是否可以直接使用key中的id进行区分呢?是否存储空间进一步节省了?如果不存uid也行,但是在工程中,一般会把uid在value中再去存储一份,方便后续写代码的时候使用。