Had a little look around and it seems that the easiest way to do it would be to store a record for every post for every user. At the moment that would be about 160(users) x 2400(posts) = 384000 records. That's just not practical. You can see why it's done per-session at the moment.

My solution would be to set a time limit, 3 days for example, for checking unread posts. Then we could keep records for each user of which posts they've read in the last 3 days. After that though, we'd have to assume posts were read or at least call them 'old posts' or something. Then when a users reads a post, if it is not older than the time limit, a record is stored for that user and that post. In the same script we could delete any records that referred to 'old' posts for that user. I think that would work, the time limit could be set in a users profile with an overall maximum set by Admins. If the tables got too big, the maximum value could be reduced.

Not the perfect solution, but the only way I can think of that doesn't involve a massive table