Redis簡易聊天室

2021-10-01 05:35:13 字數 3822 閱讀 4582

import redis

import json

import hashlib

class

redisutil

(object):

def__init__

(self)

: self.chat_room_nick_set =

'chat_room_nick_set'

self.cookie_nick =

'cookie-{}'

self.chat_list =

'chat_list'

# 初始化redis

self.client = redis.redis(

)def

is_nick_already_exists

(self, nick)

:"""

判斷這個暱稱是不是已經登入過了。如果已經登入,那麼就不能使用這個暱稱。

使用redis的集合實現,如果把暱稱sadd到集合中返回1,說明這個暱稱之前

不存在,此時應該返回false,如果返回0,表示這個暱稱之前已經存在了,此時應該返回true。

:param nick: 暱稱

:return: true or false

"""is_flag = self.client.sadd(self.chat_room_nick_set, nick)

if is_flag ==1:

return

false

return

true

defset_token

(self, nick, token)

:"""

設定token,這樣的好處是只需要登入一次,以後可以直接訪問/room頁面直接進入聊天視窗

使用redis的字串實現,字串的key是"cookie-暱稱",例如"cookie-青南",值為引數token

:param nick: 暱稱

:param token: md5字串

:return: none

"""key = self.cookie_nick.

format

(nick)

self.client.

set(key, token)

defget_token

(self, nick)

:"""

獲取token,從"cookie-暱稱"token並返回。

使用redis的字串實現,字串的key為"cookie-暱稱",例如"cookie-青南",如果這個key存在,

就獲取它的值並返回,如果這個key不存在,就返回none

:param nick: 暱稱

:return: none 或者 token字串

"""key = self.cookie_nick.

format

(nick)

token = self.client.get(key)

return

none

ifnot token else token.decode(

)def

get_chat_list

(self)

:"""

獲取聊天訊息列表。

使用redis的列表實現。key為self.chat_list屬性中儲存的字串,可以直接使用。

獲取列表右端20條資訊,但不要刪除。

需要注意,從redis中獲取的資料乙個列表,列表裡面是bytes型的字串,所以需要

先把這個列表展開,把裡面的bytes型的字串解密為普通字串以後再用json解析為

字典。接下來講解析出來的字典放入乙個新的列表中。最後返回新的列表。

:return: 包含字典的列表

"""chat_list = self.client.lrange(self.chat_list,-20

,-1)

chat_info_list =

for chat in chat_list:

chat_info = json.loads(chat)

return chat_info_list

defget_nick_msg_expire_time

(self, nick, msg)

:"""

獲取某乙個暱稱傳送某一條訊息的過期時間。這個功能的作用是

為了防止同乙個使用者短時間傳送大量相同資訊刷屏。

為了防止資訊太長,因此把資訊編碼為md5以後再與暱稱拼接以縮短key的長度。

使用redis的ttl命令來實現,ttl命令如果返回none,說明不存在這個key,

返回none。如果ttl返回-1,說明這個key沒有設定過期時間,這個key可以一直存在

如果ttl返回乙個大於0的正整數,說明在這個整數對應的秒過於以後,redis會自動

刪除這個key

:param nick: 暱稱

:param msg: 資訊

:return: none 或者 數字

"""msg_md5 = hashlib.md5(msg.encode())

.hexdigest(

) duplicate_msg_check_flag = nick + msg_md5

expire_time = self.client.ttl(duplicate_msg_check_flag)

return expire_time

defpush_chat_info

(self, chat_info)

:"""

把聊天資訊存入列表的右側。

使用redis的集合實現,對應的key為self.chat_list中儲存的字串。

把chat_info字典先轉化為json字串,再存入redis中列表中。

為了防止列表訊息太長,因此需要使用ltrim命令刪除多餘的資訊,只保留

列表最右側的20條

:param chat_info: 字典,格式為

:return: none

"""self.client.rpush(self.chat_list, json.dumps(chat_info)

) self.client.ltrim(self.chat_list,-20

,-1)

defset_nick_msg_expire_time

(self, nick, msg)

:"""

設定key的過期時間,這個功能的目的是限定同乙個使用者在2分鐘內不能傳送同樣的內容。

為了防止資訊太長,因此把資訊編碼為md5以後再與暱稱拼接以縮短key的長度。

使用redis的字串實現,字串的key為暱稱+資訊的md5編碼,值為1.使用set命令的

ex引數設定key的過期時間為120秒,時間到了以後redis會自動刪除這個key

:param nick: 暱稱

:param msg: 資訊

:return: none

"""msg_md5 = hashlib.md5(msg.encode())

.hexdigest(

) duplicate_msg_check_flag = nick + msg_md5

self.client.

set(duplicate_msg_check_flag,

1, ex=

120)

執行截圖:

PHP Ajax,簡易聊天室

index.html php愛好者聊天室公告 歡迎惡魔來到聊天室 22 05 35 php愛好者聊天室公告 歡迎天使來到聊天室 22 05 35 data.php 後端,從資料庫獲取所有聊天資訊 隨時獲取最新的聊天訊息 link mysql connect localhost root 123456...

golang websocket 簡易聊天室

先說點無關的,最近忙於工作沒有更新部落格,今天休息順便把golang websocket研究了一下,挺好玩的,寫了乙個聊天室,分享給大家.websocket包 code.google.com p go.net websocket 文件 首先安裝websocket包 go get code.googl...

網路程式設計 簡易聊天室

問題背景 多數程式猿使用scoket關鍵字有什麼用途。什麼是網路程式設計?通過使用套接字來達到程序間通訊目的的程式設計就是網路程式設計,網路程式設計最主要的工作就是在傳送端把資訊通過規定好的協議進行組裝包,在接收端按照規定好的協議把包進行解析,從而提取出對應的資訊,達到通訊的目的!中間最主要的就是資...